使用python导出数据库的所有数据表的数据结构、字段、备注、数据类型

博客主要讲述了数据库表转换为Excel表的相关内容,同时涉及多个数据库表合并的操作,与信息技术中的数据处理相关。

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

数据库表转excel表

# -*- coding=utf-8 -*-
from imp import reload

import xlwt
import MySQLdb
import warnings
import datetime
warnings.filterwarnings("ignore")

mysqlDb_config = {
    'host': '10.142.55.33',
    'user': 'root',
    'passwd': 'root',
    'port': 3306,
    'db': 'henan'
}

today = datetime.date.today()
yesterday = today - datetime.timedelta(days=1)
tomorrow = today + datetime.timedelta(days=1)


def getDB(dbConfigName):
    dbConfig = eval(dbConfigName)
    try:
        conn = MySQLdb.connect(host=dbConfig['host'], user=dbConfig['user'], passwd=dbConfig['passwd'],
                               port=dbConfig['port'],charset='utf8')
        conn.autocommit(True)
        curr = conn.cursor()
        curr.execute("SET NAMES utf8");
        curr.execute("USE %s" % dbConfig['db']);

        return conn, curr
    except MySQLdb.Error as e:
        print
        "Mysql Error %d: %s" % (e.args[0], e.args[1])
        return None, None


def mysqlTabStructure2excel(dbConfigName, tabName, schemaName, exportPath):
    # 边框的定义
    borders = xlwt.Borders()
    borders.left = 1
    borders.right = 1
    borders.top = 1
    borders.bottom = 1
    borders.bottom_colour = 0x3A
    # Initialize a style for frist row
    style_fristRow = xlwt.XFStyle()
    font = xlwt.Font()
    font.name = 'Times New Roman'
    font.bold = True
    font.colour_index = 1
    style_fristRow.font = font

    badBG = xlwt.Pattern()
    badBG.pattern = badBG.SOLID_PATTERN
    badBG.pattern_fore_colour = 6
    style_fristRow.pattern = badBG

    style_fristRow.borders = borders

    # Initialize a style for data row
    style_dataRow = xlwt.XFStyle()
    font = xlwt.Font()
    font.name = u'隶变-简 常规体'
    font.bold = False
    style_dataRow.font = font

    style_dataRow.borders = borders

    selectSql = "SELECT  TABLE_SCHEMA userName, \
        table_name tabName, \
        ORDINAL_POSITION colNo, \
        COLUMN_NAME colName, \
        COLUMN_TYPE dataType, \
        IS_NULLABLE isNull, \
        COLUMN_COMMENT colComment \
    FROM information_schema. COLUMNS \
    WHERE TABLE_SCHEMA = '{schemaName}' \
    AND table_name = '{tabName}';".format(schemaName=schemaName, tabName=tabName)

    conn, curr = getDB(dbConfigName)
    curr.execute(selectSql)
    datas = curr.fetchall()
    fields = curr.description
    workbook = xlwt.Workbook()
    sheet = workbook.add_sheet('{tabName}'.format(tabName=tabName[0:31]), cell_overwrite_ok=True)

    # 写上字段信息
    for field in range(0, len(fields)):
        sheet.write(0, field, fields[field][0], style_fristRow)

    # 获取并写入数据段信息
    row = 1
    col = 0
    for row in range(1, len(datas) + 1):
        for col in range(0, len(fields)):
            sheet.write(row, col, u'%s' % datas[row - 1][col], style_dataRow)

    workbook.save(r'{exportPath}/{exportName}.xls'.format(exportPath=exportPath, exportName=schemaName + '-' + tabName))

    curr.close()
    conn.close()


def getSchemaTab(dbConfigName, schemaName, exportPath):
    selectSql = "select TABLE_NAME tabName from information_schema.TABLES where TABLE_SCHEMA='{schemaName}';".format(
        schemaName=schemaName)
    conn, curr = getDB(dbConfigName)
    curr.execute(selectSql)
    datas = curr.fetchall()
    for tabName in datas:
        mysqlTabStructure2excel(dbConfigName, tabName[0], schemaName, exportPath)


# Batch Test
dbConfigName = 'mysqlDb_config'
schemaName = 'henan'
exportPath = 'E:/pycharm/yirongworkspace/excel'
getSchemaTab(dbConfigName, schemaName, exportPath)

多个表合并

# -*- coding: utf-8 -*-

# 将多个Excel文件合并成一个
import xlrd
import xlsxwriter
import os


# 打开一个excel文件
def open_xls(file):
    fh = xlrd.open_workbook(file)
    return fh


# 获取excel中所有的sheet表
def getsheet(fh):
    return fh.sheets()


# 获取sheet表的行数
def getnrows(fh, sheet):
    table = fh.sheets()[sheet]
    return table.nrows


# 读取文件内容并返回行内容
def getFilect(file, shnum):
    fh = open_xls(file)
    table = fh.sheets()[shnum]
    num = table.nrows
    datavalue = []
    for row in range(num):
        rdata = table.row_values(row)
        datavalue.append(rdata)
    datavalue.append('')  # 两元素间添加一空格
    return datavalue


# 获取sheet表的个数
def getshnum(fh):
    x = 0
    sh = getsheet(fh)
    for sheet in sh:
        x += 1
    return x


def searchFileOfDir(path, word):
    fpList = []
    for filename in os.listdir(path):
        fp = os.path.join(path, filename)
        if os.path.isfile(fp) and word in filename:
            fpList.append(fp)
    return fpList


if __name__ == '__main__':
    # 定义要合并的excel文件列表
    path = 'E:/pycharm/yirongworkspace/excel'
    word = 'henan'
    allxls = searchFileOfDir(path, word)

    # 存储所有读取的结果
    datavalues = []
    for fl in allxls:
        fh = open_xls(fl)
        x = getshnum(fh)
        for shnum in range(x):
            print("正在读取文件:" + str(fl) + "的第" + str(shnum) + "个sheet表的内容...")
            rvalue = getFilect(fl, shnum)
        datavalues.extend(rvalue)
    rvalue = datavalues

    # 定义最终合并后生成的新文件
    endfile = 'E:/pycharm/yirongworkspace/excel/henan.xlsx'
    wb1 = xlsxwriter.Workbook(endfile)
    # 创建一个sheet工作对象
    ws = wb1.add_worksheet()

    format_title = wb1.add_format()  # 定义format格式对象
    format_title.set_border(1)  # 定义format对象单元格边框加粗(1像素)的格式

    format_data = wb1.add_format()  # 定义format_title格式对象
    format_data.set_border(1)  # 定义format_title对象单元格边框加粗(1像素)的格式
    format_data.set_bg_color('#cccccc')  # 定义format_title对象单元格背景颜色为
    format_data.set_align('center')  # 定义format_title对象单元格居中对齐的格式
    format_data.set_bold()  # 定义format_title对象单元格内容加粗的格式

    for a in range(len(rvalue)):
        for b in range(len(rvalue[a])):
            c = rvalue[a][b]
            if c in ('userName', 'tabName', 'colNo', 'colName', 'dataType', 'isNull', 'colComment'):
                ws.write(a, b, c, format_data)
            else:
                ws.write(a, b, c, format_title)
    wb1.close()
    print("文件合并完成")
<think>我们已知用户需要导出的是“所有数据库中的所有表”,但参考引用中只提到单个数据库导出方法(dev_test/database_name)。需要扩展为全库导出。注意:用户要求的是所有数据库(包括系统数据库),但通常我们只需要导出用户数据库。另外,全库导出可能会涉及大量数据,需要谨慎。由于引用中只提供了单个数据库导出方法,我们可以通过以下思路:1.获取所有数据库名称(排除系统库,如MySQL的information_schema,performance_schema等)2.循环每个数据库,执行类似引用中的查询,将结果合并到一个Excel中。但是,在Navicat中直接执行这样的操作可能需要编写复杂的SQL脚本或使用存储过程,而且Navicat本身并没有直接提供导出所有数据库所有表的功能按钮。因此,我们可以提供两种方法:方法一:通过SQL脚本生成所有数据库导出语句,然后执行这些语句并将结果保存到不同的Excel文件中(或者合并到一个文件,但需要额外处理)方法二:使用Navicat的数据传输工具(DataTransfer)逐个数据库导出,但这样比较繁琐。由于用户希望一次性导出所有数据库的所有表,我们重点考虑方法一。以MySQL为例(引用中提供了MySQLOracle,但用户没有明确,这里以MySQL为例,如果需要Oracle可以类似处理):步骤1:获取所有用户数据库名称SELECTschema_nameFROMinformation_schema.schemataWHEREschema_nameNOTIN('information_schema','mysql','performance_schema','sys');步骤2:为每个数据库执行表结构查询(将上面的查询稍作修改,去掉表名的限制,并添加一个数据库字段)我们可以构造一个UNIONALL的查询,但要注意数据库数量多时可能性能问题。或者,将查询改为同时查询多个数据库:在WHERE条件中指定多个数据库名,但是用户要求所有数据库。然而,我们无法在单个查询中动态指定所有数据库(因为需要动态生成SQL),所以需要先获取数据库列表,再动态生成SQL。由于在Navicat中直接执行动态SQL比较麻烦(没有类似执行字符串的功能),我们可以写一个存储过程来生成结果集。但是,考虑到用户可能不想编写存储过程,我们可以用以下替代方案:1.先查询所有数据库名:SELECTschema_nameFROMinformation_schema.schemataWHEREschema_nameNOTIN('information_schema','mysql','performance_schema','sys');2.将查询结果导出(可以复制到文本编辑器),然后手动构造一个包含所有数据库名的SQL。例如,假设有三个用户数据库:db1,db2,db3,那么我们可以这样写:SELECT'db1'ASdatabase_name,TABLE_NAME,COLUMN_NAME,COLUMN_TYPE,...FROM...WHEREtable_schema='db1'UNIONALLSELECT'db2',TABLE_NAME,COLUMN_NAME,...FROM...WHEREtable_schema='db2'UNIONALLSELECT'db3',TABLE_NAME,...FROM...WHEREtable_schema='db3'3.然后执行这个大的UNIONALL语句,导出结果到Excel。但是,如果数据库很多,手动构造很麻烦。所以,我们可以用Navicat的“查询结果”导出功能,将第一步得到的数据库列表导出,然后用Excel或文本工具构造UNIONALL语句。另外一种方法是使用命令行工具(如mysqldump)或者写一个脚本(Python等),但这超出了Navicat的范围。鉴于用户要求在Navicat中操作,我们可以提供以下步骤:推荐方法:使用Navicat的批处理作业(BatchJob)?但批处理作业主要是导出表数据,不能导出元数据。因此,我们只能通过SQL查询来联合多个数据库的表结构信息。但是,需要动态构造SQL语句,这在纯SQL中难以实现。所以,我们可以分两次操作:操作A:获取数据库列表,并将其保存到临时文件或剪贴板。操作B:根据数据库列表,手动构造一个包含所有数据库的UNIONALL查询(如果数据库数量不多)。如果数据库数量很多,建议写一个存储过程或者使用脚本语言。但是,由于用户明确要求使用Navicat,并且参考引用都是直接使用SQL查询,我们尝试提供在Navicat中分步操作的方法。步骤一:获取所有数据库名称(用户自己的数据库)执行SQL:SELECTGROUP_CONCAT(CONCAT('SELECT\'',SCHEMA_NAME,'\'ASdb_name,TABLE_NAME,COLUMN_NAME,COLUMN_TYPE,CHARACTER_MAXIMUM_LENGTH,IS_NULLABLE,COLUMN_DEFAULT,COLUMN_COMMENTFROMinformation_schema.COLUMNSWHEREtable_schema=\'',SCHEMA_NAME,'\'')SEPARATOR'UNIONALL')FROMinformation_schema.schemataWHERESCHEMA_NAMENOTIN('information_schema','mysql','performance_schema','sys');这条语句会生成一个包含所有数据库查询的UNIONALL字符串。步骤二:复制步骤一查询结果中的字符串(去掉最外层的SELECT...),然后新建查询,执行这个字符串。注意:GROUP_CONCAT有长度限制,如果数据库很多,可能会被截断。所以,我们需要先查看group_concat_max_len的值,如果不够可以临时设置。为了避免截断,我们可以将结果导出到文件,然后用文本编辑器打开,复制出来执行。具体步骤:1.在Navicat中新建查询,运行:SETSESSIONgroup_concat_max_len=1000000;--临时增加长度限制SELECTGROUP_CONCAT(CONCAT('SELECT''',SCHEMA_NAME,'''ASdatabase_name,TABLE_NAME表名,COLUMN_NAME字段名称,COLUMN_TYPE字段类型,CHARACTER_MAXIMUM_LENGTH字段长度,IS_NULLABLE是否必填,COLUMN_DEFAULT默认值,COLUMN_COMMENT备注FROMinformation_schema.COLUMNSWHEREtable_schema=''',SCHEMA_NAME,'''')SEPARATOR'UNIONALL')ASquery_sqlFROMinformation_schema.schemataWHERESCHEMA_NAMENOTIN('information_schema','mysql','performance_schema','sys');2.得到query_sql字段的内容(是一个很长的字符串),复制这个字符串(不带分号)。3.新建一个查询,将复制的字符串粘贴进去,运行。注意:这里不需要分号,因为原字符串已经是一个完整的SQL。4.运行后得到的结果就是所有数据库所有表的结构信息。5.在结果网格中,右键选择“导出结果”-选择“Excel文件”,导出即可。注意:如果数据库很多或者表很多,这个查询可能会很慢,而且结果集很大,Navicat可能出现性能问题。另外,对于Oracle数据库,由于用户引用[2]中提供了Oracle的查询,我们可以用类似的方法,但是构造动态SQL的方式不同。如果用户使用的是Oracle,步骤类似,但获取数据库列表的方式不同(在Oracle中,每个用户对应一个模式(schema)),我们可以查询所有用户:SELECTusernameFROMall_users;然后为每个用户(schema)执行类似引用[2]中的查询,同样使用动态生成UNIONALL的方式。但是,由于用户没有明确是MySQL还是Oracle,我们可以先提供MySQL的解决方案,并说明Oracle类似。考虑到用户问题中同时提到了MySQLOracle,我们可以同时提供两种数据库的解决方案,但需要分开说明。由于用户要求一次导出所有数据库所有表,这个需求相对复杂,我们提供的步骤可能有些繁琐,但这是在Navicat中可行的方法。因此,我们按照MySQL数据库来回答,如果用户需要Oracle,可以进一步提问。下面按照步骤详细描述:</think> ### Navicat导出所有数据库中所有表的方法 在Navicat中导出所有数据库的所有表结构到Excel,需要分两步操作:**获取所有数据库列表** → **逐个导出表结构**。以下是详细步骤(以MySQL为例,其他数据库原理相同): --- ### **第一步:获取所有数据库名称** ```sql /* 查询所有非系统数据库 */ SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME NOT IN ( 'information_schema', 'performance_schema', 'mysql', 'sys' ); ``` 1. 在Navicat新建查询窗口执行上述SQL 2. 结果会显示所有用户数据库名称(如 `db1, db2, db3`) 3. 复制这些名称备用(或导出为CSV文件) --- ### **第二步:批量导出表结构** #### 方法一:脚本自动导出(推荐) ```sql SET group_concat_max_len = 100000; SELECT GROUP_CONCAT( CONCAT( 'SELECT "', SCHEMA_NAME, '" AS `数据库名`, ', 'TABLE_NAME AS `表名`, ', 'COLUMN_NAME AS `字段名`, ', 'COLUMN_TYPE AS `类型`, ', 'CHARACTER_MAXIMUM_LENGTH AS `长度`, ', 'IS_NULLABLE AS `允许为空`, ', 'COLUMN_DEFAULT AS `默认值`, ', 'COLUMN_COMMENT AS `备注` ', 'FROM information_schema.COLUMNS ', 'WHERE table_schema = "', SCHEMA_NAME, '"' ) SEPARATOR ' UNION ALL ' ) FROM information_schema.SCHEMATA WHERE SCHEMA_NAME NOT IN ('information_schema','performance_schema','mysql','sys') INTO @export_sql; PREPARE stmt FROM @export_sql; EXECUTE stmt; ``` **操作流程:** 1. 执行上述脚本生成联合查询 2. 在查询结果界面右键 → **Export Results...** 3. 选择格式为 Excel(.xlsx) 4. 导出完整表结构到单一文件 #### 方法二:手动循环导出 1. 为每个数据库执行以下查询(替换`db_name`): ```sql SELECT TABLE_NAME AS `表名`, COLUMN_NAME AS `字段名`, COLUMN_TYPE AS `类型`, CHARACTER_MAXIMUM_LENGTH AS `长度`, IS_NULLABLE AS `允许为空`, COLUMN_DEFAULT AS `默认值`, COLUMN_COMMENT AS `备注` FROM information_schema.COLUMNS WHERE table_schema = 'db_name'; -- 替换为实际数据库名 ``` 2. 每次查询后右键导出结果到Excel 3. 最后合并所有Excel文件 --- ### **关键注意事项** 1. **权限要求**:需具备`SELECT`权限访问`information_schema` 2. **Oracle数据库**:使用引用[2]的SQL语句适配(需替换`cols`为`all_tab_columns`) 3. **大数据库处理**:可添加`LIMIT`分批导出避免内存溢出 4. **字段扩展**:需要主键信息时添加: ```sql IF(column_key='PRI','Y','N') AS `主键` ``` > 📌 提示:系统库(如`information_schema`)通常无需导出,脚本中已自动过滤[^1][^2]。 --- ### 相关问题 1. **如何将导出的Excel表结构反向生成建表SQL?** 2. **Navicat中如何批量导出所有表的数据(非结构)?** 3. **导出字段注释乱码如何解决?** 4. **如何自动跳过空数据库导出过程?** [^1]: Navicat导出MySQL数据库表结构到Excel [^2]: Navicat导出Oracle数据库表结构(Excel)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值