将参数(列表或数组)传递给 in 运算符 - python、sql
give parameter(list or array) to in operator - python, sql
我在 python 中有一个列表。
article_ids = [1,2,3,4,5,6]
我需要在 sql 语句中使用此列表,如下所示:
SELECT id FROM table WHERE article_id IN (article_ids)
如何将此列表提供给我的 IN()
子句?
我已经尝试了一些我用谷歌搜索的方法,但我无法弄清楚。
>> print ids_list
placeholders= ', '.join('?'*len(ids_list)) # "?, ?, ?, ... ?"
query = 'SELECT article_id FROM article_author_institution WHERE institution_id IN ({})'.format(placeholders)
print query
cursor.execute(query, ids_list)
我收到的错误消息:
SELECT article_id FROM article_author_institution WHERE institution_id IN (?)
query = query % db.literal(args)
TypeError: not all arguments converted during string formatting
例如:
ids_list = [9,10]
placeholders= ', '.join('%'*len(ids_list)) # "?, ?, ?, ... ?"
query = 'SELECT aid FROM article_author_institution WHERE instid IN ({})'.format(placeholders)
print query
cursor.execute(query, ids_list)
输出和错误信息是:
SELECT aid FROM article_author_institution WHERE instid IN (%, %)
Traceback (most recent call last):
File "deneme3.py", line 11, in <module>
cursor.execute(query, ids_list)
File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 159, in execute
query = query % db.literal(args)
ValueError: unsupported format character ',' (0x2c) at index 61
我们的想法是进行这样的查询:
cursor.execute("SELECT ... IN (%s, %s, %s)", (1, 2, 3))
其中每个 %s
将被列表中的元素替换。要构造此字符串查询,您可以执行以下操作:
placeholders= ', '.join(['%s']*len(article_ids)) # "%s, %s, %s, ... %s"
query = 'SELECT name FROM table WHERE article_id IN ({})'.format(placeholders)
终于
cursor.execute(query, tuple(article_ids))
对于Python3你可以使用
article_ids = [1,2,3,4,5,6]
sql_list = str(tuple([key for key in article_ids])).replace(',)', ')')
query ="""
SELECT id FROM table WHERE article_id IN {sql_list}
""".format(sql_list=sql_list)
导致
>>> print(query)
SELECT id FROM table WHERE article_id IN (1, 2, 3, 4, 5, 6)
你可以喂给它
cursor.execute(query)
这也适用于只有 1 个值的 article_ids(其中元组生成 (1,)
)。
它也适用于字符串数组:
article_titles = ['some', 'article titles']
导致
SELECT id FROM table WHERE article_title IN ('some', 'article titles')
我认为正确的选择是使用元组数据结构。希望下面的代码对你有帮助。
article_ids = [1,2,3,4,5,6]
ids = tuple(article_ids)
query = "SELECT name FROM table WHERE article_id IN {}".format(ids)
cursor.execute(query)
我在 python 中有一个列表。
article_ids = [1,2,3,4,5,6]
我需要在 sql 语句中使用此列表,如下所示:
SELECT id FROM table WHERE article_id IN (article_ids)
如何将此列表提供给我的 IN()
子句?
我已经尝试了一些我用谷歌搜索的方法,但我无法弄清楚。
>> print ids_list
placeholders= ', '.join('?'*len(ids_list)) # "?, ?, ?, ... ?"
query = 'SELECT article_id FROM article_author_institution WHERE institution_id IN ({})'.format(placeholders)
print query
cursor.execute(query, ids_list)
我收到的错误消息:
SELECT article_id FROM article_author_institution WHERE institution_id IN (?)
query = query % db.literal(args)
TypeError: not all arguments converted during string formatting
例如:
ids_list = [9,10]
placeholders= ', '.join('%'*len(ids_list)) # "?, ?, ?, ... ?"
query = 'SELECT aid FROM article_author_institution WHERE instid IN ({})'.format(placeholders)
print query
cursor.execute(query, ids_list)
输出和错误信息是:
SELECT aid FROM article_author_institution WHERE instid IN (%, %)
Traceback (most recent call last):
File "deneme3.py", line 11, in <module>
cursor.execute(query, ids_list)
File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 159, in execute
query = query % db.literal(args)
ValueError: unsupported format character ',' (0x2c) at index 61
我们的想法是进行这样的查询:
cursor.execute("SELECT ... IN (%s, %s, %s)", (1, 2, 3))
其中每个 %s
将被列表中的元素替换。要构造此字符串查询,您可以执行以下操作:
placeholders= ', '.join(['%s']*len(article_ids)) # "%s, %s, %s, ... %s"
query = 'SELECT name FROM table WHERE article_id IN ({})'.format(placeholders)
终于
cursor.execute(query, tuple(article_ids))
对于Python3你可以使用
article_ids = [1,2,3,4,5,6]
sql_list = str(tuple([key for key in article_ids])).replace(',)', ')')
query ="""
SELECT id FROM table WHERE article_id IN {sql_list}
""".format(sql_list=sql_list)
导致
>>> print(query)
SELECT id FROM table WHERE article_id IN (1, 2, 3, 4, 5, 6)
你可以喂给它
cursor.execute(query)
这也适用于只有 1 个值的 article_ids(其中元组生成 (1,)
)。
它也适用于字符串数组:
article_titles = ['some', 'article titles']
导致
SELECT id FROM table WHERE article_title IN ('some', 'article titles')
我认为正确的选择是使用元组数据结构。希望下面的代码对你有帮助。
article_ids = [1,2,3,4,5,6]
ids = tuple(article_ids)
query = "SELECT name FROM table WHERE article_id IN {}".format(ids)
cursor.execute(query)