使用Python将按照某种特定格式的属性表excel文件动态生成建表SQL语句(使用Pandas库)

问题描述

有33个国标属性表excel文件,需要根据这些标准属性表来建数据库表。
在这里插入图片描述
每个excel的格式大概如下:

在这里插入图片描述
对于这样的繁重且基本无脑的活,我选择用Python来搞定:

代码

import pandas
import re
def getStandardDataType(x):
    x = x.replace(" ", "")
    x = x.replace(",", ",")
    x = x.replace("(", "(")
    x = x.replace(")", ")")
    if 'I' in x:
        return "int"
    elif 'C' in x:
        print(x)
        mm = re.match(r'C\((.*)\)$', x)
        return "char({0})".format(int(mm.group(1)))
    elif 'D' in  x:
        mm = re.match(r'D\((.*),(.*)\)$', x)
        print(mm.group(1))
        print(mm.group(2))
        return "decimal({0},{1})".format(mm.group(1), mm.group(2))
    elif 'L' in x:
        return 'bigint'
    elif 'T' in x:
        return 'datetime'
    else:
        print(x)
def strConvert(x):
    x = x.lower()
    x = x.replace("-", "_")
    x = x.replace(" ", "")
    if x == "systemid":
        return "system_id"
    elif x == "datasource":
        return "data_source"
    elif x == "dataListid":
        return "data_list_id"
    elif x == "reportdept":
        return "report_dept"
    elif x == "reportdate":
        return "report_date"
    return x
nice = pandas.read_excel("C:\\Users\\Hades\\Desktop\\xxxx\\A08截流设施数据.xlsx")
nice
序号中文字段名英文字段名推荐数据类型说明
01雨水口标识码Comb_IDC(17)唯一编码
12排水系统编码System_IDC(17)所属排水系统编码
23坐标xX-CoorD(11,3)合肥市坐标
34坐标yY-CoorD(11,3)合肥市坐标
45所在道路名称Road_NameC(20)设施所在道路
56雨水口形式Inlet_TypeC(10)1-平篦式;2-立篦式;3-联合式4-偏沟式;5-道牙;6-其它,并 5 雨水口形式 In...
67雨水口形状Comb_ShapeI1矩形、2圆形、3其他
78雨水口尺寸1Comb_Dimen1D(5,3)雨水口形状为矩形时填写长度,圆形时填写直径,单位:米
89雨水口尺寸2Comb_Dimen2D(5,3)雨水口为矩形时填写宽度,单位:米
910雨水篦材质Gra_MaterialC(20)1-球墨铸铁;2-灰口铸铁;3-刚格板;4-其他,并注明材质。
1011雨水篦间距Gra_SpacingD(5,3)格栅间距 单位:米
1112雨水篦厚度Gra_ThicknessD(5,3)厚度 单位:米
1213雨水口最大深度Max_DepthD(6,3)雨水口的最大深度,单位:米
1314雨水口地面高程Surface_EleD(7,3)雨水口所处位置的地面高程,单位:米
1415数据来源Data_SourceC(50)1-设计图;2-竣工图;3-现场测4-人工估计;5-其它,并注明来源
1516数据获取时间Record_DateT格式:yyyy-m-d
1617填报单位Report_DeptC(30)数据填报单位
1718填报日期Report_DateT格式:yyyy-m-d
1819设计能力Design_SluiCapaD(6,2)设计泄水能力,单位:升/秒
1920是否装备垃圾拦截装置Anti_TrashI0-否;1-是
2021是否装置防臭装置Anti_OdorI0-否;2-是
2122是否装备初期雨水截流装置IniRain_InterI0-否;3-是
2223设施状态StatesI0-否;4-是
2324备注RemarkC(100)相关事项描述
2425各阶段负责的单位unit_info_idINaN
nice["desc"] = nice["中文字段名"] + ": (" + nice["说明"] + " )"
nice["datatype1"] = nice["推荐数据类型"].apply(lambda x : getStandardDataType(x))
C(17)
C(17)
11
3
11
3
C(17)
C(50)
C(30)
C(17)
6
2
C(100)
nice["label"] = nice["英文字段名"].apply(lambda x : strConvert(x))
nice
序号中文字段名英文字段名推荐数据类型说明descdatatype1label
01截流设施标识码Divider_IDC(17)唯一编码截流设施标识码: (唯一编码 )char(17)divider_id
12排水系统编码System_IDC(17)所属排水系统编码排水系统编码: (所属排水系统编码 )char(17)system_id
23坐标XX-CoorD(11,3)应与设施中心点的坐标一致坐标X: (应与设施中心点的坐标一致 )decimal(11,3)x-coor
34坐标YY-CoorD(11,3)应与设施中心点的坐标一致坐标Y: (应与设施中心点的坐标一致 )decimal(11,3)y-coor
45截流设施类型Divider_TypeI1一闸;2一泵;3一堰;4一阀;5一其他截流设施类型: (1一闸;2一泵;3一堰;4一阀;5一其他 )intdivider_type
56截流设施连接管渠编码Diverted_IDC(17)截留设施出口连接的排水管或排水渠编码截流设施连接管渠编码: (截留设施出口连接的排水管或排水渠编码 )char(17)diverted_id
67技术资料文件Data_List_IDI技术文件编码,对应A.0.31表中的资料标识码技术资料文件: (技术文件编码,对应A.0.31表中的资料标识码 )intdata_list_id
78数据来源Data_SourceC(50)1一现场探测;2一竣工图;3-设计图;4一人工估计;5-其他,并注明来源数据来源: (1一现场探测;2一竣工图;3-设计图;4一人工估计;5-其他,并注明来源 )char(50)data_source
89数据获取日期Record _DateT格式:yyyy-MM-dd,数据来源的具体日期数据获取日期: (格式:yyyy-MM-dd,数据来源的具体日期 )datetimerecord_date
910填报单位Report_UnitC(30)数据填报单位填报单位: (数据填报单位 )char(30)report_unit
1011填报日期Report _DateT格式:yyyy-MM-dd,数据填报日期填报日期: (格式:yyyy-MM-dd,数据填报日期 )datetimereport_date
1112截流内部设施编码Connect_IDC(17)截流设施内部的闸门、阀门、溢流堰或泵的编码截流内部设施编码: (截流设施内部的闸门、阀门、溢流堰或泵的编码 )char(17)connect_id
1213截流量Cutoff_FlowD(6,2)如确定截流流量,直接设定流量,单位:升/秒截流量: (如确定截流流量,直接设定流量,单位:升/秒 )decimal(6,2)cutoff_flow
1314截流曲线Diversion_CurveI截流量变化曲线,与XY曲线表关联,X代表入流量,Y代表出流量,单位:升/秒截流曲线: (截流量变化曲线,与XY曲线表关联,X代表入流量,Y代表出流量,单位:升/秒 )intdiversion_curve
1415设施状态StatusI1-已建;2-在建;3-待废;4-已废;5-其他设施状态: (1-已建;2-在建;3-待废;4-已废;5-其他 )intstatus
1516备注RemarkC(100)相关事项说明备注: (相关事项说明 )char(100)remark
1617各阶段负责的单位unit_info_idINaNNaNintunit_info_id
table_name = "closure_facility_data "
sql = "SET FOREIGN_KEY_CHECKS=0;\nDROP TABLE IF EXISTS `{0}`;\nCREATE TABLE `{0}` (\n `id` int NOT NULL,\n".format(table_name)

def addLabel(x):
    global sql
    #x = nice[x]
    if "char" in x["datatype1"]:
        sql += "`{0}` {1} CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '{2}',\n".format(x["label"], x["datatype1"], x["desc"])
    else:
        sql += "`{0}` {1} DEFAULT NULL COMMENT '{2}',\n".format(x["label"], x["datatype1"], x["desc"])

nice.apply(addLabel,  axis=1)

sql += "`gmt_create` datetime NULL DEFAULT current_timestamp,\n`gmt_modified` datetime NULL default current_timestamp on update current_timestamp,\nPRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;"

print(sql)

最后生成的sql文件!

    SET FOREIGN_KEY_CHECKS=0;
    DROP TABLE IF EXISTS `closure_facility_data `;
    CREATE TABLE `closure_facility_data ` (
     `id` int NOT NULL,
    `divider_id` char(17) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '截流设施标识码: (唯一编码 )',
    `system_id` char(17) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '排水系统编码: (所属排水系统编码 )',
    `x-coor` decimal(11,3) DEFAULT NULL COMMENT '坐标X: (应与设施中心点的坐标一致 )',
    `y-coor` decimal(11,3) DEFAULT NULL COMMENT '坐标Y: (应与设施中心点的坐标一致 )',
    `divider_type` int DEFAULT NULL COMMENT '截流设施类型: (1一闸;2一泵;3一堰;4一阀;5一其他 )',
    `diverted_id` char(17) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '截流设施连接管渠编码: (截留设施出口连接的排水管或排水渠编码 )',
    `data_list_id` int DEFAULT NULL COMMENT '技术资料文件: (技术文件编码,对应A.0.31表中的资料标识码 )',
    `data_source` char(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '数据来源: (1一现场探测;2一竣工图;3-设计图;4一人工估计;5-其他,并注明来源 )',
    `record_date` datetime DEFAULT NULL COMMENT '数据获取日期: (格式:yyyy-MM-dd,数据来源的具体日期 )',
    `report_unit` char(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '填报单位: (数据填报单位 )',
    `report_date` datetime DEFAULT NULL COMMENT '填报日期: (格式:yyyy-MM-dd,数据填报日期 )',
    `connect_id` char(17) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '截流内部设施编码: (截流设施内部的闸门、阀门、溢流堰或泵的编码 )',
    `cutoff_flow` decimal(6,2) DEFAULT NULL COMMENT '截流量: (如确定截流流量,直接设定流量,单位:升/秒 )',
    `diversion_curve` int DEFAULT NULL COMMENT '截流曲线: (截流量变化曲线,与XY曲线表关联,X代表入流量,Y代表出流量,单位:升/秒 )',
    `status` int DEFAULT NULL COMMENT '设施状态: (1-已建;2-在建;3-待废;4-已废;5-其他 )',
    `remark` char(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '备注: (相关事项说明 )',
    `unit_info_id` int DEFAULT NULL COMMENT 'nan',
    `gmt_create` datetime NULL DEFAULT current_timestamp,
    `gmt_modified` datetime NULL default current_timestamp on update current_timestamp,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

最后:
感觉这样还是不够自动化,应该直接用python连接数据库建表。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Honyelchak

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值