【问题标题】:select from sqlite table where rowid in list using python sqlite3 — DB-API 2.0使用 python sqlite3 从 sqlite 表中选择 rowid 在列表中 - DB-API 2.0
【发布时间】:2011-04-23 18:55:43
【问题描述】:

以下作品:

>>> cursor.execute("select * from sqlitetable where rowid in (2,3);")

以下不是:

>>> cursor.execute("select * from sqlitetable where rowid in (?) ", [[2,3]] )
sqlite3.InterfaceError: Error binding parameter 0 - probably unsupported type.

有没有一种方法可以传入 python 列表而不必先将其格式化为字符串?

【问题讨论】:

    标签: python sqlite


    【解决方案1】:

    很遗憾没有。每个值都必须有自己的参数标记 (?)。 由于参数列表可以(可能)具有任意长度,因此您必须使用字符串格式来构建正确数量的参数标记。令人高兴的是,这并不难:

    args=[2,3]
    sql="select * from sqlitetable where rowid in ({seq})".format(
        seq=','.join(['?']*len(args)))
    
    cursor.execute(sql, args)
    

    【讨论】:

    • args 应该始终是参数列表或元组。参数可能是字符串,但args 本身永远不会。
    • 因为这个答案是 5 岁......这仍然有效吗? pysqlite 是否仍然不支持IN 列表?
    • 在 2020 年之前一直有用!谢谢@unutbu
    • 我们可以提供执行的值的数量是否有限制?
    • @Srikan 是的,你必须注意SQLITE_LIMIT_VARIABLE_NUMBER 限制(sqlite.org/c3ref/…),默认设置为 999。即查询中的? 不能超过 999 个
    【解决方案2】:

    在 Python 3.6 中,您还可以使用 f 字符串构建查询:

    args=[2, 3]
    query = f"SELECT * FROM sqlitetable WHERE rowid in ({','.join(['?']*len(args))})"
    cursor.execute(query, args)
    

    【讨论】:

    • 如果你想使用命名参数怎么办?
    【解决方案3】:

    SQLite 本身只支持 TEXT、INTEGER、REAL、BLOB 和 NULL 类型。如果您想使用其他类型,您必须自己添加对它们的支持。 detect_types 参数和使用模块级 register_converter() 函数注册的自定义转换器使您可以轻松地做到这一点。

    如前所述,SQLite 仅原生支持有限的一组类型。

    要将其他 Python 类型与 SQLite 一起使用,您必须将它们调整为 sqlite3 模块支持的 SQLite 类型之一:NoneType、int、float、str、bytes 之一。

    https://docs.python.org/3.6/library/sqlite3.html#using-adapters-to-store-additional-python-types-in-sqlite-databases

    【讨论】:

      猜你喜欢
      • 2018-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-09
      • 1970-01-01
      相关资源
      最近更新 更多