Python导出MySQL数据库中表的建表语句到文件

本文介绍了一种利用Python脚本实现MySQL数据库表结构的自动导出方法,并通过命令行工具mysqldump生成SQL文件,便于进行版本控制管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

为了做数据对象的版本控制,需要将MySQL数据库中的表结构导出成文件进行版本化管理,试写了一下,可以完整导出数据库中的表结构信息

# -*- coding: utf-8 -*-
import os
import pymysql


class DBTool:

    conn = None
    cursor = None

    def __init__(self,conn_dict):
        self.conn = pymysql.connect(host=conn_dict['host'],
                                    port=conn_dict['port'],
                                    user=conn_dict['user'],
                                    passwd=conn_dict['password'],
                                    db=conn_dict['db'],
                                    charset=conn_dict['charset'])
        self.cursor = self.conn.cursor()


    def execute_query(self, sql_string):
        try:
            cursor=self.cursor
            cursor.execute(sql_string)
            list = cursor.fetchall()
            cursor.close()
            self.conn.close()
            return list
        except pymysql.Error as e:
            print("mysql execute error:", e)
            raise

    def execute_noquery(self, sql_string):
        try:
            cursor = self.cursor
            cursor.execute(sql_string)
            self.conn.commit()
            self.cursor.close()
            self.conn.close()
        except pymysql.Error as e:
            print("mysql execute error:", e)
            raise

def main():
    conn_dict = {'host': '127.0.0.1', 'port': 3306, 'user': '******', 'password': '******', 'db': 'test', 'charset': 'utf8'}
    conn = DBTool(conn_dict)
    sql_gettables = "select table_name from information_schema.`TABLES` WHERE TABLE_SCHEMA = 'databas_name';"
    list = conn.execute_query(sql_gettables)

    # 文件目标路径,如果不存在,新建一个
    mysql_file_path = 'D:\mysqlscript'
    if not os.path.exists(mysql_file_path):
        os.mkdir(mysql_file_path)

    mysqldump_commad_dict = {'dumpcommad': 'mysqldump --no-data ', 'server': '127.0.0.1', 'user': '******',
                            'password': '******', 'port': 3306, 'db': 'databse_name'}

    if list:
        for row in list:
            print(row[0])
            # 切换到新建的文件夹中
            os.chdir(mysql_file_path)
            #表名
            dbtable = row[0]
            #文件名
            exportfile =  row[0] + '.sql'
            # mysqldump 命令
            sqlfromat = "%s -h%s -u%s -p%s -P%s %s %s >%s"
            # 生成相应的sql语句
            sql = (sqlfromat % (mysqldump_commad_dict['dumpcommad'],
                                mysqldump_commad_dict['server'],
                                mysqldump_commad_dict['user'],
                                mysqldump_commad_dict['password'],
                                mysqldump_commad_dict['port'],
                                mysqldump_commad_dict['db'],
                                dbtable,
                                exportfile))
            print(sql)
            result = os.system(sql)
            if result:
                print('export ok')
            else:
                print('export fail')

if __name__ == '__main__':
    main()

 

建库测试

create database test_database
charset utf8mb4 collate utf8mb4_bin;

use test_database;


create table table_a
(
    id int auto_increment not null,
    name varchar(100) unique,
    create_date datetime,
    primary key pk_id(id),
    index idx_create_date(create_date)
);

insert into table_a(name,create_date) values ('aaaaaa',now());
insert into table_a(name,create_date) values ('bbbbbb',now());

create table table_b
(
    id int auto_increment not null,
    name varchar(100) unique,
    create_date datetime,
    primary key pk_id(id),
    index idx_create_date(create_date)
);
insert into table_b(name,create_date) values ('aaaaaa',now());
insert into table_b(name,create_date) values ('bbbbbb',now());

 

执行的时候会提示一个警告,但是不影响最终的结果

mysqldump: [Warning] Using a password on the command line interface can be insecure.

导出建表语句会根据表的数据情况编号自增列,这是mysqldump的问题而不是导出的问题,如果有必要可以需求做相应的修改

 

 

 

去掉mysqldump导出表结构中备注信息

import os

filepath = "D:\\mysqlscript"
# 切换到新建的文件夹中
os.chdir(filepath)
pathDir = os.listdir(filepath)
for file in pathDir:
    lines = open(file, "r")
    content = "use ***;"
    content = content + "\n"
    for line in lines:
        print(line)
        if not (str(line).startswith("--") or str(line).startswith("/*") ):
            if(line!="\n" and str(line).startswith(") ENGINE")):
                content = content +"\n"+ ")"
            else:
                content = content + line
    #将提炼后的内容重新写入文件
    print(content)
    fp = open(file, 'w')
    fp.write(content)
    fp.close()

 

### 通过 `CREATE TABLE ... LIKE` 复制表结构 若仅需复制现有的结构而不复制数据,可以使用 `CREATE TABLE ... LIKE` 语法。该方法会创一个与原具有相同列定义、索引和约束的新。 ```sql CREATE TABLE new_table_name LIKE original_table_name; ``` 此语句将复制原的结构,包括字段类型、主键、索引等信息[^3]。 --- ### 使用 `CREATE TABLE ... AS SELECT` 创并复制部分结构 若希望基于已有的部分字段或行来创,可以使用 `CREATE TABLE ... AS SELECT` 的方式。该方法支持从原中筛选特定列或行,并生成新的表结构。 ```sql CREATE TABLE new_table_name AS SELECT * FROM original_table_name WHERE 1=0; ``` 上述语句仅复制表结构,不包含任何数据。如果需要复制部分数据,可调整 `WHERE` 条件: ```sql CREATE TABLE new_table_name AS SELECT * FROM original_table_name WHERE id < 100; ``` 此方式不会自动复制索引、主键和外键约束[^3]。 --- ### 导出语句并手动执行 若需在另一台机器上重相同结构的,可通过 `SHOW CREATE TABLE` 命令获取语句: ```sql SHOW CREATE TABLE original_table_name; ``` 输出结果中包含完整的语句,可以直接复制并在目标环境中执行以创相同结构的[^1]。 --- ### 利用 `mysqldump` 工具导出表结构 还可以使用命令行工具 `mysqldump` 仅导出表结构而不导出数据: ```bash mysqldump -u username -p database_name original_table_name --no-data > table_structure.sql ``` 参数 `--no-data` 示不导出中的数据,只导出结构。生成的 SQL 文件可在其他数据库实例中导入以重表结构[^3]。 --- ### 查询所有名并批量生成语句 如需批量导出多个语句,可以通过查询 `information_schema.TABLES` 获取名,并结合脚本语言(如 Python)动态生成语句: ```sql SELECT TABLE_NAME FROM information_schema.`TABLES` WHERE TABLE_SCHEMA = 'your_database'; ``` 然后遍历每个名执行 `SHOW CREATE TABLE` 获取对应的语句[^2]。 --- ### 示例:创一个具有相同结构的用户 假设存在如下用户: ```sql CREATE TABLE user ( id INT PRIMARY KEY COMMENT '编号', name VARCHAR(50) COMMENT '姓名', age INT COMMENT '年龄', gender VARCHAR(1) COMMENT '性别' ) COMMENT '用户'; ``` 要创结构相同的副本: ```sql CREATE TABLE user_copy LIKE user; ``` 或仅复制结构而不复制数据: ```sql CREATE TABLE user_copy AS SELECT * FROM user WHERE 1=0; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值