使用pymysql 同步表结构

主要需求从一个 MySQL 数据库(源数据库)同步表结构到另一个 MySQL 数据库(目标数据库)。具体而言,它会从源数据库中获取每个表的创建 SQL 语句,并在目标数据库中执行这些语句,以创建相同的表结构。不依赖navicat可以用下面脚本很方便的进行同步

步骤分解

  1. 导入必要的库

    复制代码
    import mysql.connector

    这里导入了 mysql.connector,这是一个用于连接 MySQL 数据库的 Python 库。

  2. 数据库连接配置

    复制代码
    source_db_config = {
        'host': 'xxx',
        'port': 32562,
        'user': 'root',
        'password': 'xxx',
        'database': 'xxx'
    }
    
    target_db_config = {
        'host': 'xxx',
        'port': 30653,
        'user': 'root',
        'password': 'xxx',
        'database': 'xxx'
    }
    • 这里定义了两个字典 source_db_configtarget_db_config,分别包含源数据库和目标数据库的连接信息。
    • 包括主机地址、端口、用户名、密码和数据库名称。
  3. 获取表结构的函数

    复制代码
    def get_table_structure(cursor, table_name):
        cursor.execute(f"SHOW CREATE TABLE {table_name};")
        result = cursor.fetchone()
        return result[1]  # 获取创建表的 SQL 语句
    • 该函数接受一个数据库游标和表名作为参数。
    • 使用 SHOW CREATE TABLE SQL 语句获取指定表的创建 SQL 语句,并返回该语句。
  4. 同步表结构的函数

    复制代码
    def sync_table_structure(source_cursor, target_cursor, table_name):
        create_table_sql = get_table_structure(source_cursor, table_name)
        try:
            target_cursor.execute(f"DROP TABLE IF EXISTS {table_name};")  # 可选:先删除目标表
            target_cursor.execute(create_table_sql)
            print(f"表 {table_name} 结构已同步。")
        except mysql.connector.Error as err:
            print(f"表 {table_name} 同步失败: {err}")
    • 此函数用于从源数据库获取表结构并在目标数据库中创建相同的表。
    • 首先调用 get_table_structure 获取创建表的 SQL 语句。
    • 然后执行 DROP TABLE IF EXISTS 以删除目标数据库中已存在的同名表(这一操作是可选的)。
    • 最后,使用获取的 SQL 语句在目标数据库中创建表,并在控制台输出同步状态。
    • 如果在执行过程中出现错误,会捕获并打印错误信息。
  5. 主逻辑函数

    复制代码
    def main():
        # 连接源数据库
        source_conn = mysql.connector.connect(**source_db_config)
        source_cursor = source_conn.cursor()
    
        # 连接目标数据库
        target_conn = mysql.connector.connect(**target_db_config)
        target_cursor = target_conn.cursor()
    
        # 获取源数据库中的所有表
        source_cursor.execute("SHOW TABLES;")
        tables = source_cursor.fetchall()
    
        for (table_name,) in tables:
            sync_table_structure(source_cursor, target_cursor, table_name)
    
        # 关闭连接
        source_cursor.close()
        source_conn.close()
        target_cursor.close()
        target_conn.close()
    • main 函数是程序的入口点。
    • 首先,连接源和目标数据库,并创建相应的游标。
    • 使用 SHOW TABLES; 查询获取源数据库中的所有表名。
    • 对于每个表,调用 sync_table_structure 进行结构同步。
    • 最后,关闭所有游标和连接以释放资源。

完整脚本

复制代码
import mysql.connector

# MySQL 配置
source_db_config = {
    'host': '192.168.110.xx',
    'port': 32562,
    'user': 'root',
    'password': 'xxx',
    'database': 'xxx'
}

target_db_config = {
    'host': '192.168.110.xxx2',
    'port': 30653,
    'user': 'root',
    'password': 'xx',
    'database': 'xx'
}

def get_table_structure(cursor, table_name):
    cursor.execute(f"SHOW CREATE TABLE {table_name};")
    result = cursor.fetchone()
    return result[1]  # 获取创建表的 SQL 语句

def sync_table_structure(source_cursor, target_cursor, table_name):
    create_table_sql = get_table_structure(source_cursor, table_name)
    try:
        # 在目标数据库中执行创建表的 SQL
        target_cursor.execute(f"DROP TABLE IF EXISTS {table_name};")  # 可选:先删除目标表
        target_cursor.execute(create_table_sql)
        print(f"表 {table_name} 结构已同步。")
    except mysql.connector.Error as err:
        print(f"表 {table_name} 同步失败: {err}")

def main():
    # 连接源数据库
    source_conn = mysql.connector.connect(**source_db_config)
    source_cursor = source_conn.cursor()

    # 连接目标数据库
    target_conn = mysql.connector.connect(**target_db_config)
    target_cursor = target_conn.cursor()

    # 获取源数据库中的所有表
    source_cursor.execute("SHOW TABLES;")
    tables = source_cursor.fetchall()

    for (table_name,) in tables:
        sync_table_structure(source_cursor, target_cursor, table_name)

    # 关闭连接
    source_cursor.close()
    source_conn.close()
    target_cursor.close()
    target_conn.close()

if __name__ == "__main__":
    main()

后面就不赘述同步完检查了

相关推荐
爬山算法1 分钟前
Redis(135)Redis的网络模型是什么?
网络·数据库·redis
L.EscaRC9 分钟前
Redis大Key与内存不足问题深度解析与应对策略
数据库·redis·缓存
雲烟29 分钟前
Qt SQLite在I.mx8上使用问题
数据库·qt·i.mx8
合作小小程序员小小店1 小时前
web开发,在线%药店管理%系统,基于Idea,html,css,jQuery,java,ssm,mysql。
java·前端·mysql·jdk·html·intellij-idea
TDengine (老段)1 小时前
TDengine 转换函数 CAST 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
苦瓜炒蛋挞1 小时前
小迪安全第二十二天-安全开发-PHP应用&数据库操作&留言板功能&第三方插件
数据库·网络安全·php·小迪安全
chushiyunen2 小时前
redis命令 geo(对地理坐标的支持)
数据库·redis·缓存
baivfhpwxf20232 小时前
删除数据表SQL,不是删除数据,是删除表结构
数据库·sql
码界奇点2 小时前
深入解析MySQL6存储过程游标与触发器的实战应用与性能优化
数据库·sql·性能优化·七牛云存储
数据知道2 小时前
FastAPI项目:从零到一搭建一个网站导航系统
python·mysql·fastapi·python web·python项目