使用 text() 函数时,SQAlchemy>2.0 不会在 MySQL 中插入或向上插入

SQAlchemy>2.0 does not INSERT or UPSERT into MySQL when using text() function

提问人:Cord Kaldemeyer 提问时间:11/15/2023 更新时间:11/16/2023 访问量:26

问:

我们最近更新了需要使用 sqlalchemy.sql.expression.text 来格式化已执行的查询。SQLAlchemy==2.0.23

在旧版本中,例如 我们可以或数据使用,使用它不再起作用。SQLAlchemy==1.4.49INSERTUPSERTsession.execute(my_query)SQLAlchemy==2.0.23session.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

有趣的是,如果我在数据库上运行普通查询,它可以完美地工作,并且日志记录还显示了一个工作查询。

关于如何解决此错误的任何提示?

python mysql sql炼金术

评论

0赞 snakecharmerb 11/15/2023
你打电话了吗?session.commit()
0赞 snakecharmerb 11/15/2023
扩展上面的评论:我认为从未提交过,至少在 1.x 版本中是这样。也许您之前的代码使用了配置了 ?或者它可能使用了 ,它曾经自动提交到 2.0。session.executeautocommit=Trueengine.execute
0赞 Cord Kaldemeyer 11/15/2023
打电话实际上是解决方案。谢谢!session.commit()

答:

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为我指明了正确的方向!