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

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

相关推荐
heze098 小时前
sqli-labs-Less-18自动化注入方法
mysql·网络安全·自动化
木风小助理8 小时前
PostgreSQL基础知识——DDL深度解析
数据库·postgresql
hanqunfeng8 小时前
(四十四)Redis8 新增的数据类型 -- Vector Set
数据库·redis·缓存
梦梦代码精10 小时前
BuildingAI vs Dify vs 扣子:三大开源智能体平台架构风格对比
开发语言·前端·数据库·后端·架构·开源·推荐算法
纪莫11 小时前
技术面:MySQL篇(InnoDB的锁机制)
java·数据库·java面试⑧股
Filotimo_11 小时前
在java开发中,cron表达式概念
java·开发语言·数据库
DBA小马哥12 小时前
从MongoDB迁移到金仓数据库:数据模型与业务连续性难题的保姆级指南
数据库·mongodb·dba
QZ1665609515912 小时前
低误差率、高性能、符合审计要求的金融数据库审计和监测最佳实践指南
数据库·金融
愚公移码12 小时前
蓝凌EKP产品:主文档权限机制浅析
java·前端·数据库·蓝凌
此生只爱蛋13 小时前
【Redis】持久化
数据库·redis