Есть ли способ привязать параметры к скомпилированному запросу db2 dialect (ibm_db_sa) после компиляции? - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь скомпилировать запрос, используя диалект 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 голосов
/ 01 февраля 2019

У документов , на которые вы ссылаетесь, есть такое решение:

В случае, когда передается простая строка 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...