2017-08-08 6 views
0

sqlalchemyの未処理SQLクエリのパラメータにリストをバインドしようとしています。 This postは、psycopg2で以下のように行うことをおすすめします。SQLAlchemy pyodbcを使用した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) 

しかし、これはpyodbcSQL Serverのための私の環境のために働くように思われません。一つだけ"?"ではなく、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/ja/latest/core/sqlelement.html#sqlalchemy.sql)を使用することができます。 expression.bindparam)が 'executemany()'を使いたい場合は、パラメータ名を明示的に制御する必要があります。あなたの例では、手作業で作成された 'params'を' execute() 'に渡す必要はありません。 –

+0

うーん、私は参照してください。私はそれが一つの方法だと思う。しかし、可能であれば、私は生のSQLクエリを書いて、パラメタとしてリストを渡したいと思います。 –

関連する問題