在Python中,如何转义字符串以用于SQLite表/列名?

8 浏览
0 Comments

在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库的怪癖。

0