在Python中,如何转义字符串以用于SQLite表/列名?
在Python中,如何转义字符串以用于SQLite表/列名?
在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"))) # 输出 [(u'cow',)]
然而,这种方法只适用于替换查询中的值。当用于表或列名时,它将失败:
import sqlite3 with sqlite3.connect(":memory:") as connection: connection.execute("CREATE TABLE foo(?)", ("bar",)) # 抛出sqlite3.OperationalError: near "?": syntax error
sqlite3
模块和PEP 249都没有提到用于转义名称或值的函数。这可能是为了阻止用户使用字符串拼接查询,但这让我感到困惑。
在SQLite中,使用变量名作为列或表的最合适的函数或技术是什么?我希望能够在没有任何其他依赖的情况下实现这个功能,因为我将在自己的封装中使用它。
我寻找但找不到SQLite语法相关部分的清晰完整描述,以便编写自己的函数。我希望能确保这将适用于SQLite允许的任何标识符,因此试错解决方案对我来说不够确定。
SQLite使用"
来引用标识符,但我不确定仅仅转义它们是否足够。PHP的sqlite_escape_string
函数的文档表明某些二进制数据可能也需要转义,但这可能是PHP库的怪癖。