SqlAlchemy 绑定参数在 mssql 上失败(但适用于 mysql)

问题描述 投票:0回答:1

我在 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)
  • Python 3.8.10
  • SQLAlchemy==1.4.39
  • pyodbc==4.0.39
python sql-server sqlalchemy azure-sql-database
1个回答
0
投票

尝试

sql_q = sql_q.bindparams(bindparam('ids', expanding=True))

bindparams
不会修改现有的 TextClause 对象,您必须重新分配它。

© www.soinside.com 2019 - 2024. All rights reserved.