我正在重构一个小项目以使用 SQLite 而不是 python 数据结构,以便我可以学习 SQLite。我一直在使用的数据结构是一个字典列表,其中每个字典的键代表一个菜单项的属性。最终,这些键应该成为 SQLite 表中的列。
我首先想到我可以通过创建单列表、迭代字典键列表并执行 , 命令来以编程方式创建表ALTER TABLE,ADD 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)
经过更多阅读后,我意识到参数不能用于标识符,只能用于文字值。PyMOTW上sqlite3说
查询参数可与select、insert和update语句一起使用。它们可以出现在查询中文字值合法的任何部分。
克赖比奇在第 14 页上说。使用 SQLite的 135 (ISBN 9780596521189):
但请注意,参数只能用于替换文字值,例如带引号的字符串或数值。参数不能用来代替标识符,例如表名或列名。以下 SQL 部分无效:
Run Code Online (Sandbox Code Playgroud)SELECT * FROM ?; -- INCORRECT: Cannot use a parameter as an identifier
我同意不能以这种方式使用位置参数或命名参数。为什么他们不能?我缺少一些一般原则吗?
类似的问题:
标识符在语法上很重要,而变量值则不然。
在 SQL 编译阶段需要知道标识符,以便编译后的内部字节码表示了解相关的表、列、索引等。仅更改 SQL 中的一个标识符就可能导致语法错误,或者至少导致一种完全不同类型的字节码程序。
文字值可以在运行时绑定。变量在已编译的 SQL 程序中的行为本质上是相同的,无论其中绑定的值如何。
| 归档时间: |
|
| 查看次数: |
892 次 |
| 最近记录: |