将来自 2 个不同数据库的表合并为一个具有相同方案的表

Merging Tables from 2 Different Databases into One with Same Scheme

我正在尝试将两个数据库合并为一个,两个数据库都包含相同的方案,但信息是唯一的。我已经编写了一个代码来将它们合并在一起,但是根据是否包含 'id' (两个 table 中的主键)我会收到错误消息。我读过,当将 tables 合并在一起时,我应该只在 tables 之一中维护主键,并将其作为自动增量以在下一个 [=23] 中设置主键=].完成此操作后,我收到一条错误消息,提示我提供的值列比 table 要求的少一列,但是当我包含 'id' 时,我收到唯一 ID 的错误消息(因为主键的在这两个程序中是完全相同的)。如果有人能告诉我为什么我的主键没有为此递增,我将非常感激。如果我描述得不好或没有提供足够的信息,请告诉我,我会在需要的地方补充。

#Table 被导入的 table 结构

def build_case_study_1_table():
    with sqlite3.connect('albums1.db') as db:
        db.execute(
            "CREATE TABLE IF NOT EXISTS albums(" \
            "id INTEGER PRIMARY KEY NOT NULL," \
            "nr INTEGER NOT NULL," \
            "band TEXT NOT NULL," \
            "song TEXT NOT NULL," \
            "album TEXT NOT NULL," \
            "duration TEXT NOT NULL);")

#Table 被合并到,我的主要 table

conn = sqlite3.connect('albums.db')
c = conn.cursor()
c.execute("""CREATE TABLE IF NOT EXISTS albums (
    id INTEGER PRIMARY KEY NOT NULL,
    nr INTERGER NOT NULL,
    band TEXT NOT NULL,
    song TEXT NOT NULL,
    album TEXT NOT NULL,
    duration TEXT NOT NULL
    )""")

#合并两者的代码

def merge_databases():
    
    db_main = sqlite3.connect('albums.db')
    db_import = sqlite3.connect('albums1.db')

    import_cursor = db_import.cursor()
    import_cursor.execute('SELECT * FROM albums')
    output = import_cursor.fetchall()
    
    sql = "INSERT INTO albums (nr, band, song, album, duration) VALUES (:nr, :band, :song, :album, :duration)"
    main_cursor = db_main.cursor()
    for row in output:
        main_cursor.execute(sql, row)
        
    db_main.commit()
    import_cursor.close()
    main_cursor.close()

您可以传递 :id + null,它将对列 id 求值为 null,并且它将获得适当的值,因为它被定义为 INTEGER PRIMARY KEY:

sql = "INSERT INTO albums VALUES (:id + null, :nr, :band, :song, :album, :duration)"
main_cursor = db_main.cursor()
for row in output:
    main_cursor.execute(sql, row)

或者,使用 executemany() 来避免 for 循环:

sql = "INSERT INTO albums  VALUES (:id + null, :nr, :band, :song, :album, :duration)"
main_cursor = db_main.cursor()
main_cursor.executemany(sql, output)