data_merge数据库合并

本文介绍了使用pymysql库进行大规模数据迁移的过程。通过设置批处理大小,优化了数据插入性能,减少了数据库操作时间。文章详细展示了如何从一个数据库连接获取数据,分批插入到另一个数据库,并记录了各步骤的耗时,为数据库维护和数据同步提供了实战参考。
import pymysql
import time

if __name__ == '__main__':

    scs_db = pymysql.connect(host='XXXXXXXXXX',
                             port=XXXXXXXXXX,
                             user='XXXXXXXXXX',
                             password='XXXXXXXXXX',
                             db='XXXXXXXXXX',
                             charset='utf8mb4')

    select_sql = """select id + 40000, `name`, origin, create_user, create_time, update_time, 
    recommend_flag, recommend_weight, delete_status, picture_url, `explain`, explain_picture_url from c_topic"""
    scs_cursor = scs_db.cursor()
    scs_record = scs_cursor.execute(select_sql)
    print('总条数:', int(scs_record))

    # database
    scs_bak_db = pymysql.connect(host='XXXXXXXXXX',
                                 port=XXXXXXXXXX,
                                 user='XXXXXXXXXX',
                                 password='XXXXXXXXXX',
                                 db='XXXXXXXXXX',
                                 charset='utf8mb4')
    scs_bak_cursor = scs_bak_db.cursor()
    insert_sql = """insert into c_topic(id, `name`, origin, create_user, create_time, update_time, 
    recommend_flag, recommend_weight, delete_status, picture_url, `explain`, explain_picture_url, read_count) 
    values(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, 0)"""

    fetch_many_start_time = time.time()
    try:
        # 每次执行1w条
        num = 100
        for i in range(int(scs_record / num)):
            print(i)
            _1 = time.time()
            batch_scs_data = scs_cursor.fetchmany(num)
            _2 = time.time()
            print('1:', str(_2 - _1))
            scs_bak_cursor.executemany(insert_sql, batch_scs_data)
            _3 = time.time()
            print('2:', str(_3 - _2))

        print('批次数据执行时间:', str(time.time() - fetch_many_start_time))

        fetch_all_start_time = time.time()
        # 剩下的一次性执行完
        last_scs_data = scs_cursor.fetchall()
        _4 = time.time()
        print('4:', str(_4 - _3))
        scs_bak_cursor.executemany(insert_sql, last_scs_data)
        _5 = time.time()
        print('5:', str(_5 - _4))
        print('剩余数据执行时间:', str(time.time() - fetch_all_start_time))

        scs_bak_db.commit()
    finally:
        scs_db.close()
        scs_bak_db.close()

在 FastAdmin 中使用 `array_merge` 合并数组时,如果遇到主键重复的问题,可以采取以下策略来避免或解决冲突: ### 1. 使用 `+` 运算符替代 `array_merge` 当处理关联数组(如数据库查询结果)时,若希望保留第一个数组中出现的主键值而不被第二个数组覆盖,可以使用 `+` 运算符。此方法适用于确保主键唯一性的场景。 ```php $array1 = [1 => 'item1', 2 => 'item2']; $array2 = [2 => 'new_item2', 3 => 'item3']; $result = $array1 + $array2; // 输出: [1 => 'item1', 2 => 'item2', 3 => 'item3'] ``` 与 `array_merge` 不同的是,`+` 运算符不会覆盖相同键名的值,而是保留左侧数组中的值[^2]。 ### 2. 手动过滤和合并 对于需要更精细控制的情况,可以手动遍历数组并根据主键进行去重处理后再合并。这种方式提供了最大的灵活性,适合复杂业务逻辑下的数组合并需求。 ```php function mergeUniqueByKey($key, $array1, $array2) { $result = []; $existingKeys = []; foreach (array_merge($array1, $array2) as $item) { if (!isset($existingKeys[$item[$key]])) { $result[] = $item; $existingKeys[$item[$key]] = true; } } return $result; } $data1 = Db::name('table1')->select(); $data2 = Db::name('table2')->select(); $combinedData = mergeUniqueByKey('id', $data1, $data2); ``` 上述函数 `mergeUniqueByKey` 接收一个用于判断唯一性的字段名(通常是主键),然后依次将两个数组中的元素添加到结果数组中,只有当该主键尚未存在于 `$existingKeys` 中时才进行添加操作,从而避免主键冲突[^2]。 ### 3. 利用 Collection 类进行高级处理 虽然 FastAdmin 没有直接提供专门用于数组合并的工具类,但其底层依赖于 ThinkPHP5 框架,因此可以利用 `think\Collection` 类提供的方法实现更为复杂的数组操作,包括但不限于基于特定字段的去重、排序等[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值