我在 azure 数据库上进行以下工作时遇到问题,而它在 mysql 数据库上工作。 请解释为什么会发生这种情况并帮助解决它,我们将不胜感激。
with engine.begin() as conn:
print(f"Running with {engine.name=}")
sql_q = text("SELECT count(*) FROM ticker WHERE id in :ids")
sql_q.bindparams(bindparam('ids', expanding=True))
result = conn.execute(
sql_q, ids=[300, 400]
).scalar_one()
print(f"{engine.name=}: {result=}")
Running with engine.name='mysql'
engine.name='mysql': result=2`
生成的mysql查询是:
'SELECT count(*) FROM ticker WHERE id in %(ids)s'
带参数:{'ids': [300, 400]}
# with mssql engine (azure db)
Running with engine.name='mssql'
# ...
sqlalchemy.exc.ProgrammingError: (pyodbc.ProgrammingError) ("A TVP's rows must be Sequence objects.", 'HY000')
[SQL: SELECT count(*) FROM ticker WHERE id in ?]
[parameters: ([300, 400],)]
(Background on this error at: https://sqlalche.me/e/14/f405)
尝试
sql_q = sql_q.bindparams(bindparam('ids', expanding=True))
bindparams
不会修改现有的 TextClause 对象,您必须重新分配它。