将来自 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)
我正在尝试将两个数据库合并为一个,两个数据库都包含相同的方案,但信息是唯一的。我已经编写了一个代码来将它们合并在一起,但是根据是否包含 '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)