用于使用Python sqlite3在数据库中创建表的SQL

时间:2017-11-08 16:53:58

标签: python string sqlite

我正在尝试创建一些具有不同名称(当然)但共享相同模式的表。为此,我在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

此外,还有什么方法可以实现同样的效果(在时间上)?

1 个答案:

答案 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))

我并不完全清楚你为什么要为不同类型的单词使用不同的表格,因为这似乎违背了数据库设计的原则。