python脚本实现自动生产sql建表语句

一、代码效果

废话不多说,先上代码展示效果,然后讲解

1.1代码

import pandas as pd
data = pd.read_excel('D:/示例1.xlsx')
data = data.fillna('NULL')
with open('./data_model.sql', 'w', encoding='utf8') as f:
    table_name = ''
    for i, j in data.iterrows():
        column_line = '`'+j.column_name+'`'+' '+j.data_type + '  '+j.default+' COMMENT \''+j.comment+'\'\n'
        if j.table_name == table_name:
            f.write('  ,'+column_line)
        else:
            if table_name != '':
                f.write(');\n\n')
            table_name = j.table_name
            table_comment = j.table_comment
            f.writelines(['DROP TABLE IF EXISTS '+j.table_name+';'+' \n  '+'CREATE TABLE '+j.table_name+' (\n'
                          , '  '+'PRIMARY KEY (`record_id`)'+' \n  '+',' + column_line])
    f.write(');')

2.2excel整理好的字段元数据信息

 2.3结果展示

DROP TABLE IF EXISTS user_login; 
  CREATE TABLE user_login (
  PRIMARY KEY (`record_id`) 
  ,`record_id` int(11)  NOT NULL AUTO_INCREMENT COMMENT '记录编号'
  ,`plat_id          ` varchar(100)  DEFAULT NULL  COMMENT '平台id'
  ,`server_id        ` int(11)  DEFAULT NULL  COMMENT '区服id'
  ,`channel_id       ` varchar(100)  DEFAULT NULL  COMMENT '渠道'
  ,`user_id          ` varchar(100)  DEFAULT NULL  COMMENT '用户ID'
  ,`role_id          ` varchar(100)  DEFAULT NULL  COMMENT '角色ID'
  ,`role_name        ` varchar(100)  DEFAULT NULL  COMMENT '角色名称'
  ,`client_ip        ` varchar(100)  DEFAULT NULL  COMMENT '客户端IP'
  ,`event_time       ` int(11)  DEFAULT NULL  COMMENT '事件时间'
  ,`op_type          ` varchar(100)  DEFAULT NULL  COMMENT '操作类型(1:登录-1登出)'
  ,`online_time      ` int(11)  DEFAULT NULL  COMMENT '在线时长(s)'
  ,`operating_system` varchar(100)  DEFAULT NULL  COMMENT '操作系统名称'
  ,`operating_version` varchar(100)  DEFAULT NULL  COMMENT '操作系统版本'
  ,`device_brand     ` varchar(100)  DEFAULT NULL  COMMENT '设备型号'
  ,`device_type      ` varchar(100)  DEFAULT NULL  COMMENT '设备品牌'
);

 二、代码讲解

#引入pandas库
import pandas as pd
#Excel文件读取到pandas DataFrame中,支持本地文件系统或URL的’xls’和’xlsx’文件扩展名
data = pd.read_excel('D:/示例1.xlsx')
#数据中的缺失值用空值
data = data.fillna('NULL')
#文件的写操作
#w: 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
with open('./data_model.sql', 'w', encoding='utf8') as f:
    f.write(');')
#for循环,iterrows():把 DataFrame 里的行当作 (index, Series)对进行迭代 ,拼接字符串,写入文件
    for i, j in data.iterrows():
        column_line = '`'+j.column_name+'`'+' '+j.data_type + '  '+j.default+' COMMENT \''+j.comment+'\'\n'
        if j.table_name == table_name:
            f.write('  ,'+column_line)
        else:
            if table_name != '':
                f.write(');\n\n')
                
            table_name = j.table_name
            f.writelines(['DROP TABLE IF EXISTS '+j.table_name+';'+' \n  '+'CREATE TABLE '+j.table_name+' (\n'
                          , '  '+'PRIMARY KEY (`record_id`)'+' \n  '+',' + column_line])
    f.write(');')

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,这是一段将MySQL建表语句转换为PostgreSQL建表语句Python脚本,包含索引: ```python def mysql_to_postgresql(mysql_query): # 将 MySQL 建表语句转换为 PostgreSQL 建表语句 postgres_query = mysql_query.replace("INT", "INTEGER") \ .replace("AUTO_INCREMENT", "SERIAL") \ .replace("DEFAULT '0000-00-00'", "") \ .replace("DEFAULT '0'", "") \ .replace("ENGINE=InnoDB", "") \ .replace("VARCHAR", "VARCHAR(255)") \ .replace("PRIMARY KEY", "PRIMARY KEY") \ .replace("UNSIGNED", "") \ .replace("COMMENT '", "COMMENT '") \ .replace("`", "\"") # 处理索引 index_start = postgres_query.find("KEY ") while index_start != -1: index_end = postgres_query.find(",", index_start) if index_end == -1: index_end = postgres_query.find(")", index_start) index_name = postgres_query[index_start:index_end].replace("`", "").replace("KEY ", "\"").replace("(", "_").replace(")", "\"") postgres_query = postgres_query[:index_start] + "CONSTRAINT " + index_name + " " + postgres_query[index_start:index_end] + postgres_query[index_end:] index_start = postgres_query.find("KEY ", index_end) return postgres_query ``` 使用方法: ```python mysql_query = "CREATE TABLE `users` (`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(50) NOT NULL, `age` INT UNSIGNED NOT NULL, `email` VARCHAR(100) NOT NULL, INDEX (`name`))" postgres_query = mysql_to_postgresql(mysql_query) print(postgres_query) ``` 输出结果: ``` CREATE TABLE "users" ("id" INTEGER SERIAL PRIMARY KEY, "name" VARCHAR(255) NOT NULL, "age" INTEGER NOT NULL, "email" VARCHAR(100) NOT NULL, CONSTRAINT "name_index" INDEX ("name")) ``` 注意事项: - 该脚本只对一些常见的 MySQL 数据类型和建表语句进行了转换,如果您的 MySQL 建表语句涉及到其他数据类型或特殊语法,可能需要对脚本进行修改。 - 索引的处理方式是将 MySQL 的 KEY 转换为 PostgreSQL 的 CONSTRAINT INDEX,索引名称的生成方式是将 KEY 后面的字段名(如果有)加上下划线作为索引名称。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

数据砼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值