MySQL数据库批量插入/更新命令

53 阅读2分钟

开发者拥有两个数据库,一个本地版本和一个服务器版本。服务器版本是最新的版本。为了避免将服务器上的所有表的所有值都复制到本地版本,开发者希望只插入或更新服务器上已更改的值,并将这些值复制到本地版本。开发者想知道是否有简单的方法来处理这种情况,例如批量插入/更新。

huake_00015_.jpg

解决方案

import MySQLdb

# 连接到本地数据库
db = MySQLdb.connect(host="localhost", user="root", passwd="password", db="local_database")

# 获取本地数据库的游标
cursor = db.cursor()

# 连接到服务器数据库
server_db = MySQLdb.connect(host="server_address", user="root", passwd="server_password", db="server_database")

# 获取服务器数据库的游标
server_cursor = server_db.cursor()

# 获取本地数据库的所有表名
tables = cursor.execute("SHOW TABLES")

# 遍历所有表名
for table in tables:
    # 获取表名
    table_name = table[0]

    # 从服务器数据库中获取表的所有字段名
    server_cursor.execute("SHOW COLUMNS FROM " + table_name)
    fields = server_cursor.fetchall()

    # 创建一个字段名列表
    field_names = []
    for field in fields:
        field_names.append(field[0])

    # 从本地数据库中获取表的所有字段值
    cursor.execute("SELECT * FROM " + table_name)
    rows = cursor.fetchall()

    # 遍历所有行
    for row in rows:
        # 从服务器数据库中获取相同行的字段值
        server_cursor.execute("SELECT * FROM " + table_name + " WHERE " + field_names[0] + " = '" + row[0] + "'")
        server_row = server_cursor.fetchone()

        # 如果服务器数据库中的行与本地数据库中的行不同,则更新本地数据库中的行
        if server_row != row:
            # 创建一个更新语句
            update_statement = "UPDATE " + table_name + " SET "
            for i in range(1, len(field_names)):
                if i != len(field_names) - 1:
                    update_statement += field_names[i] + " = '" + server_row[i] + "', "
                else:
                    update_statement += field_names[i] + " = '" + server_row[i] + "'"

            # 执行更新语句
            cursor.execute(update_statement + " WHERE " + field_names[0] + " = '" + row[0] + "'")

    # 从服务器数据库中获取本地数据库中不存在的行
    server_cursor.execute("SELECT * FROM " + table_name + " WHERE NOT " + field_names[0] + " IN (SELECT " + field_names[0] + " FROM local_database." + table_name + ")")
    new_rows = server_cursor.fetchall()

    # 插入新行到本地数据库
    for new_row in new_rows:
        # 创建一个插入语句
        insert_statement = "INSERT INTO " + table_name + " (" + ",".join(field_names) + ") VALUES ("
        for value in new_row:
            if value is None:
                insert_statement += "NULL, "
            else:
                insert_statement += "'" + value + "', "

        # 去掉最后一个逗号
        insert_statement = insert_statement[:-2] + ")"

        # 执行插入语句
        cursor.execute(insert_statement)

# 提交所有更改
db.commit()

# 关闭游标
cursor.close()
server_cursor.close()

# 关闭数据库连接
db.close()
server_db.close()

这段代码将从服务器数据库中获取本地数据库中不存在的行,并将这些行插入到本地数据库中。它还将更新本地数据库中与服务器数据库中不同的行。