【问题标题】:Is there a way to bind parameters to db2 dialect(ibm_db_sa) compiled query after compiling?编译后有没有办法将参数绑定到 db2 dialect(ibm_db_sa) 编译查询?
【发布时间】: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


【解决方案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)

【讨论】:

  • 我在使用conn.execute(text(stmt), [1]) 时不使用text() 时会出现问题,它起作用了!!谢谢!!
猜你喜欢
  • 2013-10-07
  • 1970-01-01
  • 2019-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多