在operator-python,sql中给出参数(列表或数组)

Bat*_*dak 6 python sql parameters in-clause

我在python中有一个列表.

article_ids = [1,2,3,4,5,6]
Run Code Online (Sandbox Code Playgroud)

我需要在sql语句中使用这个列表,如下所示:

SELECT id FROM table WHERE article_id IN (article_ids)
Run Code Online (Sandbox Code Playgroud)

我怎样才能将这个清单提供给我的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)
Run Code Online (Sandbox Code Playgroud)

我得到的错误消息:

SELECT article_id FROM article_author_institution WHERE institution_id IN (?)
     query = query % db.literal(args)
    TypeError: not all arguments converted during string formatting
Run Code Online (Sandbox Code Playgroud)

例如:

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)
Run Code Online (Sandbox Code Playgroud)

输出和错误消息是:

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
Run Code Online (Sandbox Code Playgroud)

ely*_*ase 10

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

cursor.execute("SELECT ... IN (%s, %s, %s)", (1, 2, 3))
Run Code Online (Sandbox Code Playgroud)

其中每个%s将被列表中的元素替换.要构造此字符串查询,您可以:

placeholders= ', '.join(['%s']*len(article_ids))  # "%s, %s, %s, ... %s"
query = 'SELECT name FROM table WHERE article_id IN ({})'.format(placeholders)
Run Code Online (Sandbox Code Playgroud)

最后

cursor.execute(query, tuple(article_ids))
Run Code Online (Sandbox Code Playgroud)


suj*_*han 5

我认为正确的选择是使用元组数据结构。希望下面的代码可以帮助你。

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)
Run Code Online (Sandbox Code Playgroud)

  • 这种解决方案很容易受到sql注入攻击。接受的答案是最安全的方法。 (7认同)
  • 如果列表只有 1 项,你会得到一个语法错误,这是因为 Python 会像这样转换元组 (1,) ... 所以逗号会导致数据库语句出现语法错误 (7认同)