iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >利用Python批量导出mysql数据库表结构的操作实例
  • 784
分享到

利用Python批量导出mysql数据库表结构的操作实例

摘要

目录前言解决方法1. Mysql 数据库 表信息查询2.连接数据库代码3.数据查询处理代码3.0 配置信息3.1查询数据库表3.2 查询对应表结构3.3 pandas进行数据保存导出excel补充:python脚本快速生

前言

最近在公司售前售后同事遇到一些奇怪的需求找到我,需要提供公司一些项目数据库所有表的结构信息(字段名、类型、长度、是否主键、***、备注),虽然不是本职工作,但是作为Python技能的拥有者看到这种需求还是觉得很容易的,但是如果不用代码解决确实非常棘手和浪费时间。于是写了一个轻量小型项目来解决一些燃眉之急,希望能对一些人有所帮助,代码大神、小神可以忽略此贴。

代码直达: gitEE、GitHub

解决方法

1. mysql 数据库 表信息查询

想要导出mysql数据库表结构必须了解一些相关数据库知识,mysql数据库支持通过SQL语句进行表信息查询:

查询数据库所有表名

SHOW TABLES

查询对应数据库对应表结构信息

SELECT COLUMN_NAME,COLUMN_TYPE,COLUMN_KEY,IS_NULLABLE, COLUMN_COMMENT 
FROM infORMation_schema.`COLUMNS` 
WHERE TABLE_SCHEMA='{dbName}' AND TABLE_NAME='{tableName}'
  • COLUMN_NAME:字段名
  • COLUMN_TYPE:数据类型
  • COLUMN_KEY:主键
  • IS_NULLABLE:非空
  • COLUMN_COMMENT:字段描述
    还有一些其他字段,有需要可自行百度

2.连接数据库代码

以下是一个较为通用的mysql数据库连接类,创建 MysqlConnection 类,放入对应数据库连接信息即可使用sql,通过query查询、update增删改、close关闭连接。

*注:数据量过大时不推荐直接使用query查询。

import pymysql

class MysqlConnection():
    def __init__(self, host, user, passw, port, database, charset="utf8"):
        self.db = pymysql.connect(host=host, user=user, passWord=passw, port=port,
                                  database=database, charset=charset)
        self.cursor = self.db.cursor()

    # 查
    def query(self, sql):
        self.cursor.execute(sql)
        results = self.cursor.fetchall()
        return results

    # 增删改
    def update(self, sql):
        try:
            self.cursor.execute(sql)
            self.db.commit()
            return 1
        except Exception as e:
            print(e)
            self.db.rollback()
            return 0

    # 关闭连接
    def close(self):
        self.cursor.close()
        self.db.close()

3.数据查询处理代码

3.0 配置信息

config.yml,这里使用了配置文件进行程序参数配置,方便配置一键运行

# 数据库信息配置
db_config:
  host: 127.0.0.1	# 数据库所在服务IP
  port: 3306		# 数据库服务端口
  username: root	# ~用户名
  password: 12346	# ~密码
  charset: utf8
  # 需要进行处理的数据名称列表 《《 填入数据库名
  db_names: ['db_a','db_b']

# 导出配置
excel_conf:
  # 导出结构Excel表头,长度及顺序不可调整,仅支持更换名称
  column_name: ['字段名', '数据类型', '长度', '主键', '非空', '描述']
  save_dir: ./data

读取配置文件的代码

import yaml

class Configure():
    def __init__(self):
        with open("config.yaml", 'r', encoding='utf-8') as f:
            self._conf = yaml.load(f.read(), Loader=yaml.FullLoader)

    def get_db_config(self):
        host = self._conf['db_config']['host']
        port = self._conf['db_config']['port']
        username = self._conf['db_config']['username']
        password = self._conf['db_config']['password']
        charset = self._conf['db_config']['charset']
        db_names = self._conf['db_config']['db_names']
        return host, port, username, password, charset, db_names

    def get_excel_title(self):
        title = self._conf['excel_conf']['column_name']
        save_dir = self._conf['excel_conf']['save_dir']
        return title, save_dir

3.1查询数据库表

利用上面创建的数据库连接和SQL查询获取所有表

class ExportMysqlTableStructureInfoToExcel():
	def __init__(self):
	        conf = Configure()	# 获取配置初始化类信息
	        self.__host, self.__port, self.__username, self.__password, self.__charset, self.db_names = conf.get_db_config()
	        self.__excel_title, self.__save_dir = conf.get_excel_title()
	```省略```
	def __connect_to_mysql(self, database):	# 获取数据库连接方法
        connect = MysqlConnection(self.__host,
                                  self.__username,
                                  self.__password,
                                  self.__port, database,
                                  self.__charset)
        return connect
        
	def __get_all_tables(self, con):	# 查询所有表
	        res = con.query("SHOW TABLES")
	        tb_list = []
	        for item in res:
	            tb_list.append(item[0])
	        return tb_list
	``````

3.2 查询对应表结构

循环获取每一张表的结构数据,根据需要对中英文做了一些转换,字段长度可以从类型中分离出来,这里使用yield返回数据,可以利用生成器加速处理过程(外包导出保存和数据库查询可以并行)

class ExportMysqlTableStructureInfoToExcel():
	```省略```
	def __struct_of_table_generator(self, con, db_name):
        tb_list = self.__get_all_tables(con)
        for index, tb_name in enumerate(tb_list):
            sql = "SELECT COLUMN_NAME,COLUMN_TYPE,COLUMN_KEY,IS_NULLABLE, COLUMN_COMMENT " \
              "FROM information_schema.`COLUMNS` WHERE TABLE_SCHEMA='{}' AND TABLE_NAME='{}'".format(db_name, tb_name)
            res = con.query(sql)
            struct_list = []
            for item in res:
                column_name, column_type, column_key, is_nullable, column_comment = item
                length = "0"
                if str(column_type).find('(') > -1:
                    column_type, length = str(column_type).replace(")", '').split('(')
                if column_key == 'PRI':
                    column_key = "是"
                else:
                    column_key = ''
                if is_nullable == 'YES':
                    is_nullable = '是'
                else:
                    is_nullable = '否'
                struct_list.append([column_name, column_type, length, column_key, is_nullable, column_comment])
            yield [struct_list, tb_name]
	```省略```

3.3 pandas进行数据保存导出excel

class ExportMysqlTableStructureInfoToExcel():
	```省略```
	def export(self):
        if len(self.db_names) == 0:
            print("请配置数据库列表")
        for i, db_name in enumerate(self.db_names):		# 对多个数据库进行处理
            connect = self.__connect_to_mysql(db_name)	# 获取数据库连接
            if not os.path.exists(self.__save_dir):		# 判断数据导出保存路径是否存在
                os.mkdir(self.__save_dir)

            file_name = os.path.join(self.__save_dir,'{}.xlsx'.format(db_name))	# 用数据库名命名导出Excel文件
            if not os.path.exists(file_name):  # 文件不存在时自动创建文件 excel
                wrokb = openpyxl.Workbook()
                wrokb.save(file_name)
                wrokb.close()
            wb = openpyxl.load_workbook(file_name)
            writer = pd.ExcelWriter(file_name, engine='openpyxl')
            writer.book = wb

            struct_generator = self.__struct_of_table_generator(connect, db_name)	# 获取表结构信息的生成器

            for tb_info in tqdm(struct_generator, desc=db_name):	# 从生成器中获取表结构并利用pandas进行格式化保存,写入Excel文件
                s_list, tb_name = tb_info
                data = pd.DataFrame(s_list, columns=self.__excel_title)
                data.to_excel(writer, sheet_name=tb_name)
            writer.close()

            connect.close()
	```省略```

补充:python脚本快速生成mysql数据库结构文档

由于数据表太多,手动编写耗费的时间太久,所以搞了一个简单的脚本快速生成数据库结构,保存到word文档中。

1.安装pymysql和document

pip install pymysql
pip install document

2.脚本

# -*- coding: utf-8 -*-
import pymysql
from docx import Document
from docx.shared import Pt
from docx.oXML.ns import qn

db = pymysql.connect(host='127.0.0.1', #数据库服务器IP
                         port=3306,
                         user='root',
                         passwd='123456',
                         db='test_db') #数据库名称)
#根据表名查询对应的字段相关信息
def query(tableName):
    #打开数据库连接
    cur = db.cursor()
    sql = "select b.COLUMN_NAME,b.COLUMN_TYPE,b.COLUMN_COMMENT from (select * from information_schema.`TABLES`  where TABLE_SCHEMA='test_db') a right join(select * from information_schema.`COLUMNS` where TABLE_SCHEMA='test_db_test') b on a.TABLE_NAME = b.TABLE_NAME where a.TABLE_NAME='" + tableName+"'"
    cur.execute(sql)
    data = cur.fetchall()
    cur.close
    return data
#查询当前库下面所有的表名,表名:tableName;表名+注释(用于填充至word文档):concat(TABLE_NAME,'(',TABLE_COMMENT,')')
def queryTableName():
    cur = db.cursor()
    sql = "select TABLE_NAME,concat(TABLE_NAME,'(',TABLE_COMMENT,')') from information_schema.`TABLES`  where TABLE_SCHEMA='test_db_test'"
    cur.execute(sql)
    data = cur.fetchall()
    return data
#将每个表生成word结构,输出到word文档
def generateWord(singleTableData,document,tableName):
    p=document.add_paragraph()
    p.paragraph_format.line_spacing=1.5 #设置该段落 行间距为 1.5倍
    p.paragraph_format.space_after=Pt(0) #设置段落 段后 0 磅
    #document.add_paragraph(tableName,style='ListBullet')
    r=p.add_run('\n'+tableName)
    r.font.name=u'宋体'
    r.font.size=Pt(12)
    table = document.add_table(rows=len(singleTableData)+1, cols=3,style='Table Grid')
    table.style.font.size=Pt(11)
    table.style.font.name=u'Calibri'
    #设置表头样式
    #这里只生成了三个表头,可通过实际需求进行修改
    for i in ((0,'NAME'),(1,'TYPE'),(2,'COMMENT')):
        run = table.cell(0,i[0]).paragraphs[0].add_run(i[1])
        run.font.name = 'Calibri'
        run.font.size = Pt(11)
        r = run._element
        r.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
    
    for i in range(len(singleTableData)):
        #设置表格内数据的样式
        for j in range(len(singleTableData[i])):
            run = table.cell(i+1,j).paragraphs[0].add_run(singleTableData[i][j])
            run.font.name = 'Calibri'
            run.font.size = Pt(11)
            r = run._element
            r.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
        #table.cell(i+1, 0).text=singleTableData[i][1]
        #table.cell(i+1, 1).text=singleTableData[i][2]
        #table.cell(i+1, 2).text=singleTableData[i][3]
    

if __name__ == '__main__':
    #定义一个document
    document = Document()
    #设置字体默认样式
    document.styles['Normal'].font.name = u'宋体'
    document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
    #获取当前库下所有的表名信息和表注释信息
    tableList = queryTableName()
    #循环查询数据库,获取表字段详细信息,并调用generateWord,生成word数据
    #由于时间匆忙,我这边选择的是直接查询数据库,执行了100多次查询,可以进行优化,查询出所有的表结构,在代码里面将每个表结构进行拆分
    for singleTableName in tableList:
        data = query(singleTableName[0])
        generateWord(data,document,singleTableName[1])
    #保存至文档
    document.save('数据库设计.docx')

3.生成的word文档预览

利用Python批量导出mysql数据库表结构的操作实例

总结

运行成功后会在目录下的data文件夹中看到保存的Excel文件(以数据库名为单位保存成文件),每个Excel第一个tab是空的(一个小bug暂未解决),其他每个tab以对应表名进行命名。

代码很简单,供各位学习参考。

到此这篇关于利用Python批量导出mysql数据库表结构的文章就介绍到这了,更多相关Python批量导出mysql表结构内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

本文标题: 利用Python批量导出mysql数据库表结构的操作实例

本文链接: https://www.lsjlt.com/news/33615.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • oracle怎么批量导出表结构和数据
    在Oracle数据库中,可以使用expdp命令来进行表结构和数据的批量导出操作。以下是一个示例: 打开命令行窗口,输入以下命令连接...
    99+
    2024-04-19
    oracle
  • mysql数据库中怎么导出表结构
    本篇文章给大家分享的是有关mysql数据库中怎么导出表结构,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。mysql表结构导出 命令行...
    99+
    2024-04-02
  • 利用PHP导出MySQL数据表结构和SQL文件
    目录 一、获取数据库所有的数据表 方法一:TP5 方法二:原生PHP 二、导出指定数据表的数据结构 三、 导出SQL文件 四、生成SQL语句  五、完整代码 前端 后端 语言:PHP 数据库:MySQL 功能:分为四部分,① 查出数据库的...
    99+
    2023-09-07
    数据库 mysql php
  • mysql怎么导出数据库所有表结构
    如果想要导出MySQL数据库中所有表的结构,可以使用以下命令: mysqldump -u username -p --no-data...
    99+
    2024-04-09
    mysql 数据库
  • linux中mysqldump导出数据库、数据、表结构的示例分析
    这篇文章主要为大家展示了“linux中mysqldump导出数据库、数据、表结构的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“linux中mysqldump导出数据库、数据、表结构的示...
    99+
    2023-06-09
  • 利用mysqldump只导出数据库的表结构、存储过程和函数
    要实现标题中的任务需要用到mysqldump的几个参数 --no-data导出不包含表中数据  --routines导出包含存储过程和函数(注:导出用户必须要有select存储过程和函数的权限) ...
    99+
    2024-04-02
  • mysql mysqldump怎么实现只导出表结构或只导出数据
    这篇文章主要介绍“mysql mysqldump怎么实现只导出表结构或只导出数据”,在日常操作中,相信很多人在mysql mysqldump怎么实现只导出表结构或只导出数据问题上存在疑惑,小编查阅了各式资料...
    99+
    2024-04-02
  • 怎么利用Navicat Premium导出数据库表结构信息至Excel的方法
    本篇内容介绍了“怎么利用Navicat Premium导出数据库表结构信息至Excel的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!...
    99+
    2024-04-02
  • 如何用PLSQL导出数据库存表结构信息
    导读 如何用PLSQL导出表结构,不用登陆数据库存,直接用plsql工具怎么导出指定表的表结构呢?下面我就介绍下如何导出。 1:进行plsql后选怎Tools...
    99+
    2024-04-02
  • mysql数据库创建账号、授权、数据导出、导入操作示例
    本文实例讲述了mysql数据库创建账号、授权、数据导出、导入操作。分享给大家供大家参考,具体如下: 1、账号创建及授权 grant all privileges on *.* to 'yangxin'@...
    99+
    2024-04-02
  • 使用python怎么批量操作redis数据库
    使用python怎么批量操作redis数据库?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。方法一:使用 pipeline  使用pipelining ...
    99+
    2023-06-08
  • MySQL数据库结构和数据的导出和导入方法介绍
    这篇文章主要讲解了“MySQL数据库结构和数据的导出和导入方法介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL数据库结构和数据的导出和导入方法介...
    99+
    2024-04-02
  • 利用Java怎么将excel表格批量导入到数据库
    本篇文章给大家分享的是有关利用Java怎么将excel表格批量导入到数据库,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。创建导入抽象类package com.gclo...
    99+
    2023-05-30
    java excel 数据库
  • 怎么用命令从mysql中导出/导入表结构及数据
    这篇文章给大家分享的是有关怎么用命令从mysql中导出/导入表结构及数据的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 在命令行下mysql的数据导出有个很好用命令mysqld...
    99+
    2024-04-02
  • Python操作Mysql数据库的实现
    1、需要使用的模块MySQLdb,下载地址为:http://sourceforge.net/projects/mysql-python/2、实现代码如下:#!/usr/bin/env python # encoding: utf-8 im...
    99+
    2023-01-31
    操作 数据库 Python
  • mysql实现查询结果导出csv文件及导入csv文件到数据库操作
    本文实例讲述了mysql实现查询结果导出csv文件及导入csv文件到数据库操作。分享给大家供大家参考,具体如下: mysql 查询结果导出csv文件: select logtime, oper...
    99+
    2024-04-02
  • MongoDB使用mongoexport和mongoimport命令,批量导出和导入JSON数据到同一张表的实例
    需求是这样的:需要修改数据库中某个表的所有数据,所以,要全部导出,然后修改,修改完之后,再把修改后的数据给再导入到mongo去。 具体如下: 备份,导出一张表为json文件 具体命令: mongoex...
    99+
    2024-04-02
  • 数据库如何实现批量删除数据的操作方法
    这篇文章主要介绍数据库如何实现批量删除数据的操作方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!package com.mescs.baseinfo.utils; import ...
    99+
    2024-04-02
  • mysql如何利用Navicat导出和导入数据库的方法
    MySql是我们经常用到的数据,无论是开发人员用来练习,还是小型私服游戏服务器,或者是个人软件使用,都十分方便。对于做一些个人辅助软件,选择mysql数据库是个明智的选择,有一个好的工具更是事半功倍,对于M...
    99+
    2024-04-02
  • 利用python中pymysql操作MySQL数据库的新手指南
    目录一. pymysql介绍 二. 连接数据库的完整流程 1. 引入pymysql模块 2. 创建连接对象 3. 使用连接对象创建游标对象 4. 准备需要使用的sql语句 5. 使用...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作