2017-08-08 110 views
0

我试图将列表绑定到sqlalchemy中的原始SQL查询中的参数。 This post建议与psycopg2这样做的好方法如下。用pyodbc SQLAlchemy SQL参数列表替换

some_ids = [1, 2, 3, 4] 
query = "SELECT * FROM my_table WHERE id = ANY(:ids);" 
engine.execute(sqlalchemy.sql.text(query), ids=some_ids) 

然而,这似乎并不为我的SQL Serverpyodbc的环境中工作。只有一个"?"被添加的,而不是4

sqlalchemy.exc.ProgrammingError: (pyodbc.ProgrammingError) 
('Invalid parameter type. param-index=0 param-type=tuple', 'HY105') 
[SQL: 'SELECT * FROM my_table WHERE id = ANY(?);'] [parameters: ((1, 2, 3, 4),)] 

有什么办法,使这项工作?如果可能的话,我想避免manually creating placeholders

SQLAlchemy的版本= 1.0.13,pyodbc版本4.0.16 =

回答

0

这似乎是为我工作:

from sqlalchemy import create_engine 
from sqlalchemy.sql import table, column, select, literal_column 
engine = create_engine('mssql+pyodbc://SQLmyDb') 
cnxn = engine.connect() 
some_ids = [2, 3] 
sql = select([literal_column('*')]).where(column('ID').in_(some_ids)).select_from(table('People')) 
print(sql) 
print('') 
params = {":ID_" + str(x+1): some_ids[x] for x in range(len(some_ids))} 
rows = cnxn.execute(sql, params).fetchall() 
print(rows) 

它打印生成的SQL语句,其次是查询的结果

SELECT * 
FROM "People" 
WHERE "ID" IN (:ID_1, :ID_2) 

[(2, 'Anne', 'Elk'), (3, 'Gord', 'Thompson')] 
+0

是的,这似乎也适用于我。但上面的原始SQL查询不起作用。任何想法为什么? –

+0

您可以使用['some_ids = [bindparam('id_1'),bindparam('id_2')]'](http://docs.sqlalchemy.org/en/latest/core/sqlelement.html#sqlalchemy.sql。如果想使用'executemany()',则可以显式控制参数名称。在你的例子中,你甚至不需要将手工形成的'params'传递给'execute()',因为它们已经绑定在你的语句中。 –

+0

嗯我明白了。我想这是一种方法。但如果可能的话,我想编写一个原始的SQL查询并将一个列表作为参数传递。 –