在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',)]
但是,这仅适用于将值替换为查询。当用于表名或列名时失败:
import sqlite3
with sqlite3.connect(":memory:") as connection:
connection.execute("CREATE TABLE foo(?)", ("bar",))
# raises sqlite3.OperationalError: near "?": syntax error
sqlite3模块和PEP 249均未提及转义名称或值的功能。大概是为了阻止用户使用字符串来组合他们的查询,但这使我无所适从。
什么功能或技术最适合在SQLite中为列或表使用变量名?我强烈希望能够在没有任何其他依赖项的情况下做到这一点,因为我将在自己的包装器中使用它。
我在寻找但找不到关于SQLite语法相关部分的清晰完整描述,以用于编写自己的函数。我想确保这对于SQLite允许的任何标识符都适用,因此试错解决方案对我来说还是不确定的。
SQLite 用来"引用标识符,但我不确定仅转义标识符就足够了。PHP sqlite_escape_string函数的文档表明,某些二进制数据可能也需要转义,但这可能是PHP库的一个怪癖。
饮歌长啸
相关分类