Search code examples
python-3.xsqlalchemydb2

Is there a way to bind parameters to db2 dialect(ibm_db_sa) compiled query after compiling?


I am trying to compiled query using db2 dialect ibm_db_sa. After compiling, it binds '?' instead of parameter.

I have tried same for MSSQL and Oracle dialects, they are giving expected results.

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())

If i print all 3 queries, will output:

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 = ?

Is there any way to get DB2 query same as others ?


Solution

  • The docs that you reference have that solution:

    In the case that a plain SQL string is passed, and the underlying DBAPI accepts positional bind parameters, a collection of tuples or individual values in *multiparams may be passed:

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

    For Db2, you just pass a comma-separated list of values as documented in the 2nd example:

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