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


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

    命令客户端

    打开 sqlite3.exe 按下面命令执行即可。

    .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 的库取的别名

    合并SQLite.bat

    1. 将两个要合并的 db 文件拖到 合并SQLite.bat 即可生成合并后的 merged.db
    2. 需要合并的在这里设置:SET "TABLE_NAMES=表1 表2 表3 表4" (用空格分割)
    @echo off
    CHCP 65001 > nul
    cd /d %~dp0
    
    REM 定义sqlite3 路径,数据库文件路径
    SET "SQLITE3_EXE=sqlite\sqlite3.exe"
    SET "DB_1=%1"
    SET "DB_2=%2"
    SET "DB_merged=merged.db"
    SET "TEMP_SQL_FILE=temp_sql_filt_4_import.txt"
    SET "TABLE_NAMES=表1 表2 表3 表4"
    
    echo ------------------------------------------
    echo  初始化
    echo ------------------------------------------
    echo.
    echo  正在创建 %DB_1% 副本 %DB_merged%
    copy "%DB_1%" "%DB_merged%" > nul
    echo.
    echo ------------------------------------------
    echo  开始合并
    echo ------------------------------------------
    echo.
    echo BEGIN TRANSACTION; > %TEMP_SQL_FILE%
    echo attach %DB_2% as db2; >> %TEMP_SQL_FILE%
    
    REM 遍历所有表名
    for %%A in (%TABLE_NAMES%) do (
    	echo insert into main."%%A"  select * from db2."%%A"; >> %TEMP_SQL_FILE%
    )
    echo COMMIT; >> %TEMP_SQL_FILE%
    
    REM 显示命令
    type %TEMP_SQL_FILE%
    
    "%SQLITE3_EXE%" "%DB_merged%" < %TEMP_SQL_FILE%
    echo.
    echo ------------------------------------------
    echo  合并成功
    echo ------------------------------------------
    
    REM 清理资源
    del %TEMP_SQL_FILE%
    
    PAUSE
    

    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()
    

    命令行调用

    python merge_dbs.py D:\v1\mydb.db D:\v1\mydb.db D:\v1\merged.db 表1 表2
    
  • 相关阅读:
    SpringBoot 注解 ==
    AI目标分割能力,无需绿幕即可实现快速视频抠图
    【JavaScript-数组全家福】
    docker的常用命令(持续更新中)
    Python 有哪些流行的开发框架和库?
    热烈祝贺方正璞华两款产品入选2021年度江苏省工业软件优秀产品和应用解决方案拟推广名单
    springboot在实体上格式化时间
    谷粒商城 缓存
    一次搞定N个渠道的引流方式--“引流短链”
    如何使用Python构建OTP验证系统?
  • 原文地址:https://blog.csdn.net/jx520/article/details/141065411