linuxsir首页 LinuxSir.Org | Linux、BSD、Solaris、Unix | 开源传万世,因有我参与欢迎您!
网站首页 | 设为首页 | 加入收藏
您所在的位置:主页 > Linux数据库 >

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

时间:2018-03-17  来源:未知  作者:admin666

为了做数据对象的版本控制,需要将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()

友情链接
  • Mozilla发布Firefox 67.0.4,修复沙箱逃逸漏洞
  • 蚂蚁金服正式成为CNCF云原生计算基金会黄金会员
  • Firefox 68将采用Microsoft BITS安装更新
  • OpenSSH增加对存储在RAM中的私钥的保护
  • 谷歌想实现自己的curl,为什么?
  • Raspberry Pi 4发布:更快的CPU、更大的内存
  • Firefox的UA将移除CPU架构信息
  • Ubuntu放弃支持32位应用程序实属乌龙,Steam会否重回Ubuntu怀抱
  • Qt 5.13稳定版发布:引入glTF 2.0、改进Wayland以及支持Lottie动
  • 红帽企业Linux 7现已内置Redis 5最新版
  • Slack进入微软内部禁用服务清单,GitHub也在其列?
  • 安全的全新编程语言V发布首个可用版本
  • Windows Terminal已上架,快尝鲜
  • 阿里巴巴微服务开源生态报告No.1
  • 面世两年,Google地球将支持所有基于Chromium的浏览器
  • 推进企业容器化持续创新,Rancher ECIC千人盛典完美收官
  • CentOS 8.0最新构建状态公布,或于数周后发布
  • Debian移植RISC
  • 微软拆分操作系统的计划初现雏形
  • Oracle发布基于VS Code的开发者工具,轻松使用Oracle数据库
  • Ubuntu 19.10停止支持32位的x86架构
  • 微软为Windows Terminal推出全新logo
  • 联想ThinkPad P系列笔记本预装Ubuntu系统
  • 微软发布适用于Win7/8的Microsoft Edge预览版
  • 启智平台发布联邦学习开源数据协作项目OpenI纵横
  • 经过六个多月的延迟,微软终于推出Hyper
  • ZFS On Linux 0.8.1 发布,Python可移植性工作
  • DragonFly BSD 5.6.0 发布,HAMMER2状态良好
  • Linux Kernel 5.2
  • CentOS 8.0 看起来还需要几周的时间
  • 百度网盘Linux版正式发布
  • PCIe 6.0宣布:带宽翻倍 狂飙至256GB/s
  • PHP 7.4 Alpha 发布,FFI扩展,预加载Opcache以获得更好的性能
  • Canonical将在未来的Ubuntu版本中放弃对32位架构的支持
  • Scala 2.13 发布,改进的编译器性能
  • 微软的GitHub收购了Pull Panda,并且使所有订阅完全免费
  • Windows Subsystem for Linux 2 (WSL 2)现在适用于Windows 10用
  • Debian 10 “Buster”的RISC
  • MariaDB宣布发布MariaDB Enterprise Server 10.4
  • DXVK 1.2.2 发布,带来微小的CPU开销优化
  • DragonFlyBSD 5.6 RC1 发布,VM优化,默认为HAMMER2
  • PrimeNG 8.0.0 发布,支持Angular 8,FocusTrap等
  • GIMP 2.10.12 发布,一些有用的改进
  • 清华大学Anaconda 镜像服务即将恢复
  • Debian GNU/Linux 10 “Buster” 操作系统将于2019年7月6日发布
  • 时时彩论坛
  • 五星体育斯诺克
  • 北单比分直播
  • 河北11选5走势图
  • 福建体彩36选7开奖结果
  • 九龙图库下载