编译后是否有方法将参数绑定到db2方言(ibm_db_sa)编译的查询?

时间:2019-01-31 12:17:31

标签: python-3.x sqlalchemy db2

我正在尝试使用db2方言ibm_db_sa来编译查询。编译后,它绑定“?”而不是参数。

我对MSSQL和Oracle方言也尝试过相同的方法,它们给出了预期的结果。

import ibm_db_sa
from sqlalchemy import bindparam
from sqlalchemy import Table, MetaData, Column, Integer

tab = Table('customers', MetaData(), Column('cust_id', Integer, 
primary_key=True))
stmt = select([tab]).where(literal_column('cust_id') == 
bindparam('cust_id'))
ms_sql = stmt.compile(dialect=mssql.dialect())
oracle_q = stmt.compile(dialect=oracle.dialect())
db2 = stmt.compile(dialect=ibm_db_sa.dialect())

如果我打印所有3个查询,将输出:

MSSQL => SELECT customers.cust_id FROM customers WHERE cust_id = :cust_id
Oracle => SELECT customers.cust_id FROM customers WHERE cust_id = :cust_id
DB2 => SELECT customers.cust_id FROM customers WHERE cust_id = ?

有没有办法使DB2查询与其他查询相同?

1 个答案:

答案 0 :(得分:1)

您引用的docs具有该解决方案:

  

如果传递了普通的SQL字符串,并且基础   DBAPI接受位置绑定参数,元组的集合或   可以传递* multiparams中的各个值:

conn.execute(
    "INSERT INTO table (id, value) VALUES (?, ?)",
    (1, "v1"), (2, "v2")
)

conn.execute(
    "INSERT INTO table (id, value) VALUES (?, ?)",
    1, "v1"
)

对于Db2,您只需传递一个逗号分隔的值列表,如第二个示例中所述:

conn.execute(stmt,1, "2nd value", storeID, whatever)