sqlite 合并两个数据库中的特定表
- 命令行
- [python 版本](#python 版本)
命令行
c
.open 'v1/mydb.db'
attach 'v2/mydb.db' as db2;
insert into main.表1 select * from db2.表1;
insert into main.表2 select * from db2.表2;
.exit
参数 | 说明 |
---|---|
v1/mydb.db |
主db文件路径,合并后的结果就是它。 |
v2/mydb.db |
要合并进 主db 的库。(合完后我们就不需要它了) |
main |
.open 打开的是主库,默认名称为 main |
db2 |
这是我们为 attach 的库取的别名 |
python 版本
python
import sqlite3
import shutil
import argparse
def merge_tables_from_second_to_first(db1_path, db2_path, merged_db_path, table_names):
# 复制主数据库以生成合并后的副本
shutil.copyfile(db1_path, merged_db_path)
# 连接到第二个数据库
conn2 = sqlite3.connect(db2_path)
cursor2 = conn2.cursor()
# 连接到合并后的数据库
conn_merged = sqlite3.connect(merged_db_path)
cursor_merged = conn_merged.cursor()
for table_name in table_names:
# 从第二个数据库中获取指定表的数据
cursor2.execute(f"SELECT * FROM {table_name}")
data2 = cursor2.fetchall()
column_names2 = [description[0] for description in cursor2.description]
# 如果表在合并后的数据库中不存在,则创建
cursor_merged.execute(f"CREATE TABLE IF NOT EXISTS {table_name} ({', '.join(column_names2)})")
# 插入数据到合并后的数据库中
insert_query = f"INSERT INTO {table_name} ({', '.join(column_names2)}) VALUES ({', '.join(['?' for _ in column_names2])})"
cursor_merged.executemany(insert_query, data2)
# 提交更改并关闭连接
conn_merged.commit()
conn2.close()
conn_merged.close()
def main():
parser = argparse.ArgumentParser(description="合并两个 SQLite 数据库中的特定表")
parser.add_argument("db1_path", help="主数据库文件路径")
parser.add_argument("db2_path", help="要合并的数据库文件路径")
parser.add_argument("merged_db_path", help="合并后的数据库文件路径")
parser.add_argument("table_names", nargs='+', help="需要合并的表名列表(两个库中的表名及表结构必须一致)")
args = parser.parse_args()
merge_tables_from_second_to_first(args.db1_path, args.db2_path, args.merged_db_path, args.table_names)
if __name__ == "__main__":
main()
命令行调用
bash
python merge_dbs.py D:\v1\mydb.db D:\v1\mydb.db D:\v1\merged.db 表1 表2