提问人:Cord Kaldemeyer 提问时间:11/15/2023 更新时间:11/16/2023 访问量:26
使用 text() 函数时,SQAlchemy>2.0 不会在 MySQL 中插入或向上插入
SQAlchemy>2.0 does not INSERT or UPSERT into MySQL when using text() function
问:
我们最近更新了需要使用 sqlalchemy.sql.expression.text
来格式化已执行的查询。SQLAlchemy==2.0.23
在旧版本中,例如 我们可以或数据使用,使用它不再起作用。SQLAlchemy==1.4.49
INSERT
UPSERT
session.execute(my_query)
SQLAlchemy==2.0.23
session.execute(text(my_query))
下面是该问题的最小示例:
from sqlalchemy import create_engine, text
from sqlalchemy.orm import create_session
my_query = """
INSERT INTO test (`col_a`, `col_b`)
VALUES (4, 7), (5, 8), (6, 9) as nd
ON DUPLICATE KEY
UPDATE `col_a` = nd.`col_a`, `col_b` = nd.`col_b`
"""
constring = "mysql+pymysql://my_user:[email protected]:3306/my_db"
connection = create_engine(constring)
connection.echo = True # enable logging
session = create_session(bind=connection)
cursor = session.execute(text(my_query)) # does not INSERT or UPSERT
有趣的是,如果我在数据库上运行普通查询,它可以完美地工作,并且日志记录还显示了一个工作查询。
关于如何解决此错误的任何提示?
答:
0赞
Cord Kaldemeyer
11/16/2023
#1
似乎较新版本的 SQLAlchemy 不应用自动提交。>2
记录:sqlalchemy==2.0.23
2023-11-16 07:34:26,461 INFO sqlalchemy.engine.Engine SELECT DATABASE()
2023-11-16 07:34:26,461 INFO sqlalchemy.engine.Engine [raw sql] {}
2023-11-16 07:34:26,525 INFO sqlalchemy.engine.Engine SELECT @@sql_mode
2023-11-16 07:34:26,525 INFO sqlalchemy.engine.Engine [raw sql] {}
2023-11-16 07:34:26,555 INFO sqlalchemy.engine.Engine SELECT @@lower_case_table_names
2023-11-16 07:34:26,556 INFO sqlalchemy.engine.Engine [raw sql] {}
2023-11-16 07:34:26,618 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2023-11-16 07:34:26,619 INFO sqlalchemy.engine.Engine
INSERT INTO test (`col_a`, `col_b`)
VALUES (4, 7), (5, 8), (6, 9) as nd
ON DUPLICATE KEY
UPDATE `col_a` = nd.`col_a`, `col_b` = nd.`col_b`
2023-11-16 07:34:26,619 INFO sqlalchemy.engine.Engine [generated in 0.00026s] {}
相同的日志:sqlalchemy==1.4.49
2023-11-16 07:35:25,120 INFO sqlalchemy.engine.Engine SELECT DATABASE()
2023-11-16 07:35:25,120 INFO sqlalchemy.engine.Engine [raw sql] {}
2023-11-16 07:35:25,182 INFO sqlalchemy.engine.Engine SELECT @@sql_mode
2023-11-16 07:35:25,182 INFO sqlalchemy.engine.Engine [raw sql] {}
2023-11-16 07:35:25,215 INFO sqlalchemy.engine.Engine SELECT @@lower_case_table_names
2023-11-16 07:35:25,215 INFO sqlalchemy.engine.Engine [raw sql] {}
2023-11-16 07:35:25,279 INFO sqlalchemy.engine.Engine
INSERT INTO test (`col_a`, `col_b`)
VALUES (4, 7), (5, 8), (6, 9) as nd
ON DUPLICATE KEY
UPDATE `col_a` = nd.`col_a`, `col_b` = nd.`col_b`
2023-11-16 07:35:25,279 INFO sqlalchemy.engine.Engine [generated in 0.00036s] {}
2023-11-16 07:35:25,310 INFO sqlalchemy.engine.Engine COMMIT
感谢@snakecharmerb为我指明了正确的方向!
评论
session.commit()
session.execute
autocommit=True
engine.execute
session.commit()