我正在尝试创建一些具有不同名称(当然)但共享相同模式的表。为此,我在executemany
对象上使用Cursor
,如下所示:
tables = ['Meanings', 'Synonyms', 'Antonyms', 'Examples', 'Phrases',
'Pronunciations', 'Hyphenations']
create_table_query = '''CREATE TABLE (?) (
id INTEGER NOT NULL,
text TEXT,
word_id INTEGER NOT NULL,
PRIMARY KEY id,
FOREIGN KEY(word_id) REFERENCES Word(id)
)'''
cursor.executemany(create_table_query, tables)
当我执行此代码段时,收到以下错误消息:
OperationalError: near "(": syntax error
我无法使用我的SQL修复此错误,因为我发现错误消息不够具有描述性。我尝试了以下查询,但我无法理解他们的成功和我的查询失败:
create_table_query_1 = '''CREATE TABLE {} (
id INTEGER NOT NULL,
text TEXT,
word_id INTEGER NOT NULL,
PRIMARY KEY id,
FOREIGN KEY(word_id) REFERENCES Word(id)
)''' # Syntax error near "id"
create_table_query_2 = '''CREATE TABLE (?) (
id INTEGER PRIMARY KEY,
text TEXT,
word_id INTEGER NOT NULL,
FOREIGN KEY(word_id) REFERENCES Word(id)
)''' # Syntax error near "("
create_table_query_1 = '''CREATE TABLE {} (
id INTEGER PRIMARY KEY,
text TEXT,
word_id INTEGER NOT NULL,
FOREIGN KEY(word_id) REFERENCES Word(id)
)''' # works with string formatting
此外,还有什么方法可以实现同样的效果(在时间上)?
答案 0 :(得分:2)
将我的评论放入答案并展开:您无法参数化表格或列名称。我无法找到任何关于此的文件...
在其他几个示例中,您还有SQLite不需要的额外parens /括号。
正如您所发现的那样,解决方案是在最终示例中对表名使用字符串替换。
这是一个在所有表中循环的示例:
for table in tables:
cursor.execute('''CREATE TABLE {} (
id INTEGER PRIMARY KEY,
text TEXT,
word_id INTEGER NOT NULL,
FOREIGN KEY(word_id) REFERENCES Word(id)
)'''.format(table))
我并不完全清楚你为什么要为不同类型的单词使用不同的表格,因为这似乎违背了数据库设计的原则。