如何在SQLAlchemy和Firebird中的自定义查询中将Python列表作为参数绑定?

Nir*_*ran 3 python firebird sqlalchemy

环境

我将Firebird数据库和SQLAlchemy用作ORM包装器。

背景

我知道通过使用in_它可以传递子句中的sales_id列表IN并获得结果。

我有一个用例,其中必须使用文本sql

这是我的摘录,

conn.execute('select * from sellers where salesid in (:sales_id)', sales_id=[1, 2, 3] ).fetchall()
Run Code Online (Sandbox Code Playgroud)

这总是抛出 token unknown error

我需要做的就是传递sales_id[1, 2, 3])列表以绑定参数(:sales_id)并获取结果集。

Ilj*_*ilä 5

如果使用的DB-API驱动程序不提供对元组和列表的特殊处理以生成行构造函数和IN谓词的表达式,则可以使用由bindparam以下提供的“扩展”功能:

stmt = text('select * from sellers where salesid in :sales_id') 
stmt = stmt.bindparams(bindparam('sales_id', expanding=True))

conn.execute(stmt, sales_id=[1, 2, 3]).fetchall()
Run Code Online (Sandbox Code Playgroud)

这将sales_id在每个查询的基础上用所需的占位符替换占位符,以适应用作参数的序列。

  • `conn.execute(stmt, sales_id=[1, 2, 3]).fetchall()` 返回 `TypeError: get_bind() 获得意外的关键字参数 'sales_id'`。通过更改为 `conn.execute(stmt, {'sales_id': [1, 2, 3]} ).fetchall()`,我能够得到我需要的东西。谢谢伊尔贾·埃弗里拉 (3认同)