在SQLite查询中使用变量值的标准方法是"问号样式",如下所示:
import sqlite3
with sqlite3.connect(":memory:") as connection:
connection.execute("CREATE TABLE foo(bar)")
connection.execute("INSERT INTO foo(bar) VALUES (?)", ("cow",))
print(list(connection.execute("SELECT * from foo")))
# prints [(u'cow',)]
Run Code Online (Sandbox Code Playgroud)
但是,这仅适用于将值替换为查询.用于表或列名称时失败:
import sqlite3
with sqlite3.connect(":memory:") as connection:
connection.execute("CREATE TABLE foo(?)", ("bar",))
# raises sqlite3.OperationalError: near "?": syntax error
Run Code Online (Sandbox Code Playgroud)
sqlite3模块和PEP 249都没有提到转义名称或值的功能.据推测,这是为了阻止用户用字符串组装他们的查询,但这让我感到茫然.
什么函数或技术最适合在SQLite中为列或表使用变量名?我非常希望能够在没有任何其他依赖项的情况下执行此操作,因为我将在我自己的包装器中使用它.
我找了但是找不到SQLite语法相关部分的清晰完整的描述,用来编写我自己的函数.我想确保这适用于SQLite允许的任何标识符,因此试错法对我来说太不确定了.
SQLite 用于"引用标识符,但我不确定只是转义它们就足够了.PHP sqlite_escape_string函数的文档表明某些二进制数据也可能需要转义,但这可能是PHP库的一个怪癖.