【问题标题】:How to get variable length placeholders in a Python call to SQLite3如何在对 SQLite3 的 Python 调用中获取可变长度占位符
【发布时间】:2011-11-03 14:57:59
【问题描述】:

有没有办法在 SQL 查询中使用可变长度占位符?

现在有了一个 3 元组,我写了这样的东西:

c.execute('SELECT * FROM table WHERE word IN (?, ?, ?)', tup)

但是如果 tup 可以有不同的长度,可能是 4 元组或 2 元组怎么办?在这种情况下是否有使用占位符的语法?如果没有,编写代码的首选方式是什么?

【问题讨论】:

    标签: python sqlite


    【解决方案1】:

    你必须做这样的事情(使用你的例子):

    tup = ... # some sequence/tuple of unknown length
    sql = 'SELECT * FROM table WHERE word IN (%s)' % ', '.join('?' for a in tup)
    c.execute(sql, tup)
    

    这样,您可以在 sqlite3 模块解析之前动态创建占位符列表并格式化 SQL 字符串。

    【讨论】:

    • 我希望有 ??或 ?* 这类事情的变体,但你的建议会很好。
    • 我会把', '.join('?' for a in tup)写成', '.join('?'*len(tup))
    • @Duncan:我不知道这对我来说似乎不太清楚更多的信号噪声。生成器理解似乎更像英语
    • 'SELECT * FROM table WHERE word IN (%s)' % (len(tup) * '?, ') 会起作用,还是 SQL 查询不接受最后一个逗号?
    • 我希望 @eyquem 现在已经解决了这个问题,但为了完整起见:不,尾随逗号在此处的语法无效,尽管 may vary by implementation (与 SQL 一样)。
    猜你喜欢
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 2015-09-16
    • 2022-11-11
    • 2015-08-17
    • 2016-12-20
    相关资源
    最近更新 更多