2016-03-30 18 views
0

pythonでmysqlのパラメータ一式を渡す必要があります。ここに私のコードは次のとおりです。PythonリストのWHERE IN句

sql = """ SELECT * from my_table WHERE name IN (%s) AND id=%(Id)s AND puid=%(Puid)s""" 

params = {'Id':id,'Puid' : pid} 
in_p=', '.join(list(map(lambda x: '%s', names))) 
sql = sql %in_p 

cursor.execute(sql, names) #todo: add params to sql clause 

問題は、私は句でSQLするには、名前のリストを渡したいです。一方、私はまた、SQLクエリ句にパラメータとしてidとPUIDを渡したいです。これらをPythonでどのように実装するのですか?

答えて

1

cursor.executeの引数について考えてみましょう。あなたは最終的に実行したい

cursor.execute("SELECT * FROM my_table WHERE name IN (%s, %s, %s) AND id = %s AND puid = %s;", ["name1", "name2", "name3", id, pid]) 

どのようにそこに着きますか?厄介な部分は、の変数番号をIN節に入れています。あなたがおそらくthis answerから見たように、ソリューションはそれを動的に構築し、それを文字列に%形式にすることです。

in_p = ', '.join(list(map(lambda x: '%s', names))) 
sql = "SELECT * FROM my_table WHERE name IN (%s) AND id = %s AND puid = %s;" % in_p 

しかし、これは機能しません。あなたが得る:

TypeError: not enough arguments for format string 

Pythonはあなたが交換したくない第二の二%s S、について混乱しているように見えます。ソリューションは%をエスケープすることにより、異なったもの%s Sを治療するためのPythonのを伝えることです:最後に

sql = "SELECT * FROM my_table WHERE name IN (%s) AND id = %%s AND puid = %%s;" % in_p 

、引数を構築し、クエリを実行する:

args = names + [id, pid] 
cursor.execute(sql, args) 
+0

素晴らしいが、それは動作します!ありがとうuniverio。しかし、もう1つの質問ですが、もし私の引数が次のようなマップならどうでしょうか? args = names + {'tid':id、 'tpid':pid} それはうまくいきますか? – Jensz

+0

@ Jenszどうしてあなたはそれを試してみませんか? – univerio

+0

動作しません。 Python raise error:TypeError:リストを連結してリスト( "dict"ではなく)のみリスト – Jensz

-1
sql = """ SELECT * from my_table WHERE name IN (%s) AND id=%(Id)s AND puid=%(Puid)s""".replace("%s", "%(Clause)s") 
print sql%{'Id':"x", 'Puid': "x", 'Clause': "x"} 

これはあなたを助けることができます。