SQLAlchemy执行INSERT...ON DUPLICATE KEY报错,MySQL Workbench运行正常求解答
问题排查与解决
核心问题
你错误地使用了f-string构造SQL语句,导致SQLAlchemy未对:setting_id、:value这些参数占位符做处理,直接将带占位符的SQL发送给MySQL,而MySQL无法识别这种语法,从而抛出1064错误。
修正后的代码
移除f-string前缀,让SQLAlchemy负责参数绑定:
with engine.begin() as con: con.execute("""INSERT INTO TeamSettings (TeamID, SettingID, Value) SELECT Teams.ID, :setting_id, :value FROM Teams ON DUPLICATE KEY UPDATE SettingID=VALUES(SettingID)""", {"setting_id": 57, "value": None})
额外说明
- 参数绑定逻辑:SQLAlchemy的
execute方法会自动处理:xxx格式的命名参数,不需要用f-string拼接,f-string会破坏参数绑定机制,导致占位符直接暴露给数据库。 - ON DUPLICATE KEY UPDATE优化:使用
VALUES(SettingID)可以直接引用INSERT语句中对应的字段值,无需重复传递参数,更简洁且避免参数重复绑定的潜在问题。 - 逻辑一致性:注意你在Workbench中执行的语句是
UPDATE TeamID=Teams.ID,但代码中是UPDATE SettingID=:setting_id,请确认业务逻辑是否一致,避免出现不符合预期的更新。
内容的提问来源于stack exchange,提问作者Port
相关产品推荐
相关产品推荐

