我正在尝试使用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查询与其他查询相同?
答案 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)