sqlite 合并两个数据库中的特定表

sqlite 合并两个数据库中的特定表

命令行

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
相关推荐
晚霞的不甘40 分钟前
揭秘 CANN 内存管理:如何让大模型在小设备上“轻装上阵”?
前端·数据库·经验分享·flutter·3d
市场部需要一个软件开发岗位1 小时前
JAVA开发常见安全问题:纵向越权
java·数据库·安全
海奥华21 小时前
mysql索引
数据库·mysql
2601_949593652 小时前
深入解析CANN-acl应用层接口:构建高效的AI应用开发框架
数据库·人工智能
javachen__2 小时前
mysql新老项目版本选择
数据库·mysql
Dxy12393102162 小时前
MySQL如何高效查询表数据量:从基础到进阶的优化指南
数据库·mysql
Dying.Light2 小时前
MySQL相关问题
数据库·mysql
蜡笔小炘3 小时前
LVS -- 利用防火墙标签(FireWall Mark)解决轮询错误
服务器·数据库·lvs
韩立学长3 小时前
基于Springboot泉州旅游攻略平台d5h5zz02(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·旅游
Re.不晚3 小时前
MySQL进阶之战——索引、事务与锁、高可用架构的三重奏
数据库·mysql·架构