法治政府建设内容网站公开课网站建设定制
sqlite 合并两个数据库中的特定表
- 命令行
- python 版本
命令行
.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 版本
import sqlite3
import shutil
import argparsedef 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()
命令行调用
python merge_dbs.py D:\v1\mydb.db D:\v1\mydb.db D:\v1\merged.db 表1 表2