SQLite:为什么不能使用参数来设置标识符?

jos*_*ith 4 python sqlite

我正在重构一个小项目以使用 SQLite 而不是 python 数据结构,以便我可以学习 SQLite。我一直在使用的数据结构是一个字典列表,其中每个字典的键代表一个菜单项的属性。最终,这些键应该成为 SQLite 表中的列。

我首先想到我可以通过创建单列表、迭代字典键列表并执行 , 命令来以编程方式创建表ALTER TABLEADD COLUMN如下所示:

# Various import statements and initializations

conn = sqlite3.connect(database_filename)
cursor = conn.cursor()
cursor.execute("CREATE TABLE menu_items (item_id text)")

# Here's the problem:
cursor.executemany("ALTER TABLE menu_items ADD COLUMN ? ?", [(key, type(value)) for key, value in menu_data[0].iteritems()])
Run Code Online (Sandbox Code Playgroud)

经过更多阅读后,我意识到参数不能用于标识符,只能用于文字值。PyMOTWsqlite3

查询参数可与selectinsertupdate语句一起使用。它们可以出现在查询中文字值合法的任何部分。

克赖比奇在第 14 页上说。使用 SQLite的 135 (ISBN 9780596521189):

但请注意,参数只能用于替换文字值,例如带引号的字符串或数值。参数不能用来代替标识符,例如表名或列名。以下 SQL 部分无效:

SELECT * FROM ?; -- INCORRECT: Cannot use a parameter as an identifier
Run Code Online (Sandbox Code Playgroud)

我同意不能以这种方式使用位置参数或命名参数。为什么他们不能?我缺少一些一般原则吗?

类似的问题:

laa*_*lto 5

标识符在语法上很重要,而变量值则不然。

在 SQL 编译阶段需要知道标识符,以便编译后的内部字节码表示了解相关的表、列、索引等。仅更改 SQL 中的一个标识符就可能导致语法错误,或者至少导致一种完全不同类型的字节码程序。

文字值可以在运行时绑定。变量在已编译的 SQL 程序中的行为本质上是相同的,无论其中绑定的值如何。