将参数(列表或数组)赋给in运算符-python、sql

将参数(列表或数组)赋给in运算符-python、sql,python,sql,parameters,in-clause,Python,Sql,Parameters,In Clause,我有一个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)) # "?, ?, ?, ...

我有一个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
从文章作者所在的机构选择援助(%,%)
回溯(最近一次呼叫最后一次):
文件“deneme3.py”,第11行,在
cursor.execute(查询、ID\u列表)
文件“/usr/lib/python2.7/dist packages/MySQLdb/cursors.py”,执行中的第159行
query=查询%db.literal(args)
ValueError:索引61处不支持格式字符“,”(0x2c)

我们的想法是有这样一个查询:

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)
    SELECT id FROM table WHERE article_title IN ('some', 'article titles')
你可以喂它

cursor.execute(query)
这也适用于只有1个值的项目ID(其中tuple生成
(1,)

它也适用于字符串数组:

article_titles = ['some', 'article titles']
导致

>>> print(query)

    SELECT id FROM table WHERE article_id IN (1, 2, 3, 4, 5, 6)
    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)

不再工作了,我编辑并把输出和我的代码放到问题上。如果您检查并提供帮助,我将非常感激您是否使用sqlite?你用的是什么数据库?什么python驱动程序?Db是mysql,python版本是2.7,您使用哪个模块从python访问Db?这就是问题所在,我假设Sqlite,在mysql中我们需要
%s
而不是
。请尝试我最新的答案。我真的觉得这是最好的,最干净的答案。不知道为什么我是唯一的投票人。。。最干净的回答!谢谢你,Andrew Einhorn&Hanan Atalah
str(tuple([key for key in article_id])。replace(',),')
为我节省了很多时间。谢谢