我在azure db上使用以下代码时遇到了麻烦,而它在mysql db上使用. 解释为什么会发生这种情况,并帮助解决它将受到赞赏.

        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

推荐答案

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

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

Python相关问答推荐

对Numpy函数进行载体化

将特定列信息移动到当前行下的新行

如何使用matplotlib在Python中使用规范化数据和原始t测试值创建组合热图?

为什么sys.exit()不能与subproccess.run()或subprocess.call()一起使用

如何更改分组条形图中条形图的 colored颜色 ?

try 将一行连接到Tensorflow中的矩阵

运输问题分支定界法&

从一个系列创建一个Dataframe,特别是如何重命名其中的列(例如:使用NAs/NaN)

把一个pandas文件夹从juyter笔记本放到堆栈溢出问题中的最快方法?

创建可序列化数据模型的最佳方法

isinstance()在使用dill.dump和dill.load后,对列表中包含的对象失败

使用Python异步地持久跟踪用户输入

如何使用Azure Function将xlsb转换为xlsx?

如何使用大量常量优化代码?

如何获取给定列中包含特定值的行号?

使用pythonminidom过滤XML文件

我如何为测试函数的参数化提供fixture 生成的数据?如果我可以的话,还有其他 Select 吗?

如何在Polars中处理用户自定义函数的多行结果?

利用广播使减法更有效率

如何计算Pandas 中具有特定条件的行之间的天差