【问题标题】:give parameter(list or array) to in operator - python, sql [duplicate]将参数(列表或数组)提供给 in 运算符 - python,sql [重复]
【发布时间】:2015-03-09 01:30:58
【问题描述】:

我在 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

【问题讨论】:

    标签: python sql parameters in-clause


    【解决方案1】:

    我认为正确的选择是使用元组数据结构。希望下面的代码对您有所帮助。

    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)
    

    【讨论】:

    • 老实说,我觉得这是最好、最干净的答案。不知道为什么我是唯一的赞成票......?
    • 最干净的答案!谢谢
    • 谢谢你,安德鲁·艾因霍恩和哈南·阿塔拉
    • 这种方案容易受到sql注入攻击。接受的答案是最安全的方法。
    【解决方案2】:

    对于 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')
    

    【讨论】:

    • str(tuple([key for key in article_ids])).replace(',)', ')') 为我节省了很多时间。谢谢!
    【解决方案3】:

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

    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))
    

    【讨论】:

    • 不再工作,我编辑并将输出和我的代码放到问题中。如果您检查并提供帮助,我将不胜感激
    • 你在使用 sqlite 吗?你用的是什么数据库?什么python驱动?
    • db是mysql,python版本是2.7
    • 您使用哪个模块从 python 访问数据库?
    • 这就是问题所在,我假设是 Sqlite,在 MySQL 中我们需要 %s 而不是 ?。请尝试我的更新答案。
    猜你喜欢
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    • 2012-07-15
    相关资源
    最近更新 更多