我正在重构一个小项目以使用 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 ?; …