Python学习:自动生成Mysql建表语句

Python&Mysql

    • 一、生成建表语句
    • 二、执行建表语句

一、生成建表语句

  • 使用Python批量自动生成Mysql中已有表的建表语句
import osdef generate_create_table_sql(cursor,file_path,table_name,schema):# 获取表的列信息cursor.execute(f"SHOW FULL COLUMNS FROM {table_name}")columns = cursor.fetchall()# 获取表的主键信息cursor.execute(f"SHOW KEYS FROM {table_name} WHERE Key_name = 'PRIMARY'")primary_keys = cursor.fetchall()#获取表的唯一约束信息cursor.execute(f"SHOW INDEX FROM {table_name} WHERE Non_unique = 0 AND Key_name != 'PRIMARY'")unique_constraints = cursor.fetchall()#获取表的索引信息cursor.execute(f"SHOW INDEX FROM {table_name} WHERE Key_name != 'PRIMARY' AND Non_unique != 0")indexes = cursor.fetchall()#获取表注释信息cursor.execute(f"SHOW TABLE STATUS LIKE '{table_name}'")table_status = cursor.fetchone()table_comment = table_status[17]# 生成建表语句create_table_sql = f"CREATE TABLE IF NOT EXISTS {schema}.{table_name} (\n"for column in columns:column_name = column[0]data_type = column[1]is_nullable = column[3]column_default = column[5]column_comment = column[8]# 判断是否为主键is_primary_key = column_name in [pk[4] for pk in primary_keys]# 构建列的字符串表示column_definition = f"    {column_name} {data_type}"if column_name.upper() == 'ID':column_definition += " AUTO_INCREMENT"# 添加是否为空约束if is_nullable == 'NO':column_definition += " NOT NULL"# 添加默认值if column_default is not None:column_definition += f" DEFAULT {column_default}"# 添加注释if column_comment:column_definition += f" COMMENT '{column_comment}'"# 添加主键约束if is_primary_key:column_definition += " PRIMARY KEY"create_table_sql += f"{column_definition},\n"#添加唯一约束,若唯一约束名相同,唯一约束应拼接在一起unique_constraints_dict = {}for constraint in unique_constraints:constraint_name = constraint[2]column_name = constraint[4]if constraint_name in unique_constraints_dict:unique_constraints_dict[constraint_name].append(column_name)else:unique_constraints_dict[constraint_name] = [column_name]for constraint_name,column_names in unique_constraints_dict.items():columns_str = ",".join(column_names)create_table_sql += f"    CONSTRAINT {constraint_name} unique ({columns_str}),\n"#添加索引indexes_dict = {}for index in indexes:index_name = index[2]column_name = index[4]if index_name in indexes_dict:indexes_dict[index_name].append(column_name)else:indexes_dict[index_name] = [column_name]for index_name,column_names in indexes_dict.items():columns_str = ",".join(column_names)create_table_sql += f"    INDEX {index_name} ({columns_str}),\n"# 去除最后一行的逗号create_table_sql = create_table_sql.rstrip(",\n")create_table_sql += f"\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT = '{table_comment}';"file_path = os.path.join(file_path,f"{table_name}.sql")with open(file_path,'w',encoding="utf") as f:f.write(create_table_sql)print(f"Successfully write {table_name}")
import pymysql
from Mysql.GenerateCreateTableSql import generate_create_table_sqlconn = pymysql.connect(host='localhost',port=1521,user='test',password='test',database='test_db',charset='utf8mb4')
cursor = conn.cursor()
table_names = []
schema = 'test_db'
file_path = r'D:/data'
with open(r'table_names.txt','r') as f:table_names = [line.strip() for line in f if line.strip()]
for tab in table_names:generate_create_table_sql(cursor,file_path,tab,schema)# 关闭数据库连接
cursor.close()
conn.close()

二、执行建表语句

import os
import pymysql#连接数据库
conn = pymysql.connect(host='localhost',port=1521,user='test',password='test',database='test_db',charset='utf8mb4')cursor = conn.cursor()#读取并执行sql脚本文件
script_file = r'D:\data'
for file in os.listdir(script_file):if file.endswith('.sql'):script_path = os.path.join(script_file,file)with open(script_path,'r',encoding='utf-8') as f:script = f.read()cursor.execute(script)conn.commit()print(f'successfully executed {file}')#关闭连接
cursor.close()
conn.close()print("Sql脚本执行完成")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/157892.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

11.21假设检验,第一第二类错误

两类错误 做假设的时候,首选假设都是已知的参数。 备选假设是不确定的。 要验证的是已知的可能的参数,也就是说是在这样一组数据下的分布,的概率,是不是落在拒绝域里,如果落在拒绝域里就说明当下的假设不成立&#…

Vue 响应式数据的判断

isRef:检查一个值是否为一个 ref 对象。 isReactive:检查一个对象是否由 reactive 创建的响应式数据。 isReadonly:检查一个对象是否由 readonly 创建的只读数据。 isProxy:检查一个对象是否由 reactive 或者 readonly 创建的数…

单链表OJ题——10.环形链表2

10.环形链表2 142. 环形链表 II - 力扣(LeetCode) /* 解题思路: 如果链表存在环,则fast和slow会在环内相遇,定义相遇点到入口点的距离为X,定义环的长度为C,定义头到入口的距离为L,fast在slow进入环之后一圈内追上slow…

【攻防世界-misc】simple_transfer

1.下载并打开文件, 2.这个文件是一个pcap文件, 用wireshark打开,并按上图步骤操作, 会自动定位到有flag的这个信息行,这时需要右键追踪该信息的tcp流即可。 向下查找时,可以看到有一个pdf文件在这个里面&…

【Java基础】Java导Excel攻略

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【开源】基于Vue和SpringBoot的教学过程管理系统

项目编号: S 054 ,文末获取源码。 \color{red}{项目编号:S054,文末获取源码。} 项目编号:S054,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 教师端2.2 学生端2.3 微信小程序端2…

8 个有效的安卓数据恢复软件——可让丢失的文件起死回生!

所有数字设备最终都会失败。安卓设备也不例外,无论您使用的是 Android 手机还是平板电脑。由于缺乏备份、意外删除、存储卡问题、生根错误等,您可能会丢失一些宝贵的数据。 如果发生这种情况,最好的选择之一是使用安卓数据恢复软件——这可能…

Xilinx Zynq-7000系列FPGA任意尺寸图像缩放,提供两套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐FPGA图像处理方案FPGA图像缩放方案 3、设计思路详解HLS 图像缩放介绍 4、工程代码1:图像缩放 HDMI 输出PL 端 FPGA 逻辑设计PS 端 SDK 软件设计 5、工程代码2:图像缩放 LCD 输出PL 端 FPGA 逻辑设计PS 端 SDK 软件设…

移动端适配-(postcss-pxtorem)

基于vuevant的移动端适配(rem) 1.下载lib-flexible --save npm i lib-flexible --save2.在main.js中引入lib-flexible main.js import lib-flexible/flexible3.设置meta标签 <meta name"viewport" content"widthdevice-width, initial-scale1, maximum-s…

Java面试题08

1.jsp 和 servlet 有什么区别&#xff1f; JSP&#xff08;JavaServer Pages&#xff09;是一种在HTML中嵌入Java代码的技术&#xff0c;适合用于生成动态内容&#xff1b; Servlet是Java编写的服务器端程序&#xff0c;用于处理HTTP请求和响应。 JSP (Java Server Pages) 和 …

漏洞检测与EPSS评分

EPSS (利用预测评分系统)是为了测量特定的漏洞在野外被利用的可能性。EPSS 得分范围从0% (最低的利用概率)到100% (最高的利用概率)。此外&#xff0c;由于仅从概率得分很难推断出真正的意义&#xff0c;EPSS 还提供百分位排名; 百分位排名衡量 EPSS 概率相对于所有其他 EPSS 得…

Qt无边框设计

//指定窗口为无边框 this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint);重写鼠标事件&#xff1a; void mousePressEvent(QMouseEvent* event) override;

Python算法——树的路径和算法

Python算法——树的路径和算法 树的路径和算法是一种在树结构中寻找从根节点到叶节点的所有路径&#xff0c;其路径上的节点值之和等于给定目标值的算法。这种算法可以用Python语言实现&#xff0c;本文将介绍如何使用Python编写树的路径和算法&#xff0c;并给出一些示例代码…

事关Django的静态资源目录设置与静态资源文件引用(Django的setting.py中的三句静态资源(static)目录设置语句分别是什么作用?)

在Django的setting.py中常见的三句静态资源(static)目录设置语句如下&#xff1a; STATICFILES_DIRS [os.path.join(BASE_DIR, static_list)] # 注意这是一个列表,即可以有多个目录的路径 STATIC_ROOT os.path.join(BASE_DIR, static_root) STATIC_URL /static-url/本文介…

vue前端项目如何配置后端项目的请求地址

在 Vue 前端项目中配置后端项目的访问地址可以通过修改项目的配置文件来实现。Vue 常用的配置文件是 vue.config.js&#xff0c;你可以按照以下步骤进行配置&#xff1a; 在 Vue 项目的根目录下&#xff0c;创建或编辑 vue.config.js 文件。 在 vue.config.js 中&#xff0c;可…

PCS7中如何实现DB块变量的自动上传

问题:如何实现PCS7中DB块中变量的自动上传? 解答:PCS7下,所有CFC中的变量都通过编译的方式自动上传的OS项目中,针对自定义的DB块同样也可以通过设置相关属性自动上传的OS中,具体操作如下: 插入一个全局数据块。 注意:数据块号必须符合要求,可以参考PCS7中定义的预留DB…

【代数学习题4.1】从零理解范数与迹 —— 求极小多项式

从零理解范数与迹 —— 求极小多项式 写在前面概念解释题目解答 1. 极小多项式极小多项式的求法1. 对 α \alpha α 的极小多项式python求解 2. 对 α 1 \alpha 1 α1 的极小多项式python找到多项式python找到极小多项式 3. 对 α 2 α 1 \alpha^2 \alpha 1 α2α1 的…

Android : ListView + BaseAdapter-简单应用

​​容器与适配器&#xff1a;​​​​​ http://t.csdnimg.cn/ZfAJ7 示例图&#xff1a; 实体类 News.java package com.example.mylistviewbaseadapter.entity;public class News {private String title;private String content;private int img;public News(Str…

【Linux】Linux中的基本概念

Linux中的基本概念 1. 路径分隔符/2. 当前目录 .3. 返回上级目录 . .目录结构&#xff1a;多叉树 4. 路径5. 路径 { 绝对路径 相对路径 }6. * 通配符 指定路径下的所有文件7. 同级目录下&#xff0c;不允许存在同名文件&#xff0c;或者同名目录8. 命令的本质就是可执行文件9…