2016-11-04 15 views
1

任意の長さのリストで動作するIN演算子を持つSQL文を作成したいと思います。私はpython、pandas、およびsqlalchemyを使って作業しています。Pythonでsqlalchemyとpandasを使って可変長のリストを持つSQLクエリを作成する

は例えば、私が実行したい問い合わせは、私が試してみました

SELECT * FROM users WHERE age IN (25, 26, 27)" 

の場合:

import pandas as pd 
from sqlalchemy.sql import text 

ages = (25, 26, 27) 
query = text("SELECT * FROM users WHERE age IN (:x)") 
df = pd.read_sql_query(query, conn, params={"x":ages}) 

しかし、これはエラーになります。クエリを正しく構築するにはどうすればよいですか? IN演算子のリストに値が1つしかない場合(つまり、ages = tuple(25))にソリューションを動作させたいと思います。

+0

あなたが試してみたいことがあります[この](http://stackoverflow.com/a/26184603/5741205)。 PSはSQLiteのために私のために働かなかったし、現在私は他のSQLデータベースに対してそれをチェックすることはできません... – MaxU

答えて

1

解決策の1つは、pythonの文字列join()メソッドを使用することです。

例は次のようになります。

import pandas as pd 
from sqlalchemy.sql import text 

ages = (25, 26, 27) 
ages = (str(n) for n in ages) 
ages = ','.join(ages) 
query = text("SELECT * FROM users WHERE age IN (:x)") 
df = pd.read_sql_query(query, conn, params={"x":ages}) 
+1

それは正しいように見えません。 'WHERE age IN(25,26,27)'ではなく 'WHERE age IN('25,26,27 ')'という結果になります。 – univerio

1

は、動的SQL文字列はパラメータのための辞書内包表記を使用して、プレースホルダと動的ディクショナリ作成のための構築を検討してください。以下は、あなたのRDMSはコロンという名前のパラメータを使用してSQLiteのある前提としています

import pandas as pd 
from sqlalchemy.sql import text 

ages = (25, 26, 27) 
placeholders = ', '.join([':param'+str(i) for i in range(len(ages))]) 
paramdict = {'param'+str(i): ages[i] for i in range(len(ages))} 

query = text("SELECT * FROM users WHERE age IN ({})".format(placeholders)) 
# SELECT * FROM users WHERE age IN (:param0, :param1, :param2) 

df = pd.read_sql_query(query, conn, params=paramdict) 
関連する問題