【发布时间】:2019-02-01 15:42:37
【问题描述】:
我正在尝试使用 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 查询与其他查询一样吗?
【问题讨论】:
-
您是问编译语句(数据库方言)的语法差异还是如何使用?
-
为什么重要? SQLA 应该处理关于参数的 DB-API 实现中的差异:python.org/dev/peps/pep-0249/#paramstyle
-
编译后确定我正在尝试执行相同的操作。那么我应该为那个'传递什么参数?例如,
conn.execute(stmt, {cust_id: 1}) -
您可能已经尝试了 2-3 种可能的组合,并想出了类似
conn.execute(stmt,1)或conn.execute(stmt,custid)...? -
@data_henrik 对于多个值我应该如何在执行方法中传递值。我尝试在 [docs.sqlalchemy.org/en/latest/core/… 之后传递
conn.execute(stmt, (1, 1)),但它给出错误AttributeError: 'list' object has no attribute 'keys'
标签: python-3.x sqlalchemy db2