当前位置: 首页 > news >正文

使用python操作数据库

文章目录

  • 一、问题背景
  • 二、安装python
  • 三、代码示例
  • 四、总结

一、问题背景

在日常开发过程中,随着项目进展和业务功能的迭代,我们需要对数据库的表结构进行修改,向部分表中追加字段,并对追加后的字段进行数据填充。但是如果需要追加字段的表比较多,并且追加字段后,还可能需要对数据库的脚本进行维护,此时手动操作就过于耗时,所以借助python来操作数据库,进行统一修改。

二、安装python

Python3 环境搭建 | 菜鸟教程

三、代码示例

在使用之前需要先安装mysql.connector包,命令如下:

pip3 install mysql.connector

python代码如下:

import mysql.connector
from mysql.connector import errorcode# 数据库连接配置
config = {'host': '你的地址','port': '你的端口','user': '你的用户','password': '你的密码','database': '你的数据库'
}# 要追加的表和字段,允许指定多个表和多个字段,格式为 {'表名': [('字段名', '注释'), ...]}
tables_to_check = {'sys_user': [('org_code', '组织机构代码')],
}def connect_to_database(config):"""连接数据库:param config: 数据库连接配置:return: 数据库连接"""try:cnx = mysql.connector.connect(**config)# 启用事务cnx.autocommit = Falsereturn cnxexcept mysql.connector.Error as err:if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:print("用户名或密码错误")elif err.errno == errorcode.ER_BAD_DB_ERROR:print("指定的数据库不存在")else:print(err)return Nonedef check_and_add_fields(cursor, table, fields):"""检查并添加字段:param cursor: 游标:param table: 表:param fields: 字段列表:return: alter 语句"""cursor.execute(f"DESCRIBE {table}")existing_fields = {row[0] for row in cursor.fetchall()}alter_statements = []for field, comment in fields:if field not in existing_fields:alter_statement = f"ALTER TABLE {table} ADD COLUMN {field} VARCHAR(50) COMMENT '{comment}';"alter_statements.append(alter_statement)cursor.execute(alter_statement)return alter_statementsdef update_org_code(cursor, table):"""更新 org_code 字段(此方法用于对追加的字段填充数据,可根据具体需求进行改造):param cursor: 游标:param table: 表:return: 空"""update_statement = f"""UPDATE {table} tJOIN sys_dept d ON t.dept_id = d.dept_idSET t.org_code = d.org_code;"""cursor.execute(update_statement)def print_summary(alter_statements_summary, tables_updated, no_alter_needed):"""输出更新和未更新表的信息:param alter_statements_summary: 修改语句列表:param tables_updated: 更新了的表:param no_alter_needed: 无需修改的表列表:return: 空"""print("\n追加字段修改语句:")for table, alter_statements in alter_statements_summary:print(f"{table} 修改语句:")for stmt in alter_statements:print(stmt)print("\n更新追加字段的表:")for table in tables_updated:print(table)print("\n不需要追加字段的表:")for table in no_alter_needed:print(table)def main():"""主函数:return: 空"""print("连接数据库...")cnx = connect_to_database(config)if not cnx:returnprint("开始修改...")try:cursor = cnx.cursor()alter_statements_summary = []tables_updated = []no_alter_needed = []for table, fields in tables_to_check.items():alter_statements = check_and_add_fields(cursor, table, fields)if alter_statements:alter_statements_summary.append((table, alter_statements))tables_updated.append(table)update_org_code(cursor, table)else:no_alter_needed.append(table)# 提交事务cnx.commit()print("所有修改提交成功")print_summary(alter_statements_summary, tables_updated, no_alter_needed)except mysql.connector.Error as err:# 回滚事务cnx.rollback()print(f"发生异常,错误信息: {err}")print("所有修改全部回滚")finally:cursor.close()cnx.close()if __name__ == "__main__":main()

执行结果:

连接数据库...
开始修改...
所有修改提交成功追加字段修改语句:
sys_user 修改语句:
ALTER TABLE sys_user ADD COLUMN org_code VARCHAR(50) COMMENT '组织机构代码';更新追加字段的表:
sys_user不需要追加字段的表:

四、总结

以上python代码只是我们日常开发需求的一个缩影,大家可以根据自己的具体需求,进行修改。最主要的是明白自己要解决的问题是什么,如何借助工具更好的解决问题,提升自己的工作效率。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • mysql学习教程,从入门到精通,SQL 删除数据(DELETE 语句)(18)
  • PE-PINCodes 规则
  • Apache Spark — Repartition 与 Coalesce(调整数据集分区)
  • 直播标准权威发布,阿里云RTS获首批卓越级评估认证
  • 神经网络通俗理解学习笔记(1)
  • Redisson分布式锁分析,可重入、可续锁(看门狗)
  • Oracle中VARCHAR和VARCHAR2的区别
  • ModbusTCP/RTU转Ethernet/IP(CIP)-Modbus设备与罗克韦尔AB的PLC之间通讯
  • Spring框架基础知识
  • JAVA学习笔记02-integer
  • 【C++】多态的认识和理解
  • 大数据-133 - ClickHouse 基础概述 全面了解
  • 【Spring】面试题:Spring,Spring Boot, Spring MVC 的关系以及区别(5)
  • flutter集成百度地图定位 ‘BMKLocationManager.h‘ file not found报错
  • 《Learning to Prompt for Vision-Language Models》CoOp论文中文校对版
  • 【Amaple教程】5. 插件
  • 【技术性】Search知识
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Angularjs之国际化
  • angular组件开发
  • CentOS6 编译安装 redis-3.2.3
  • es6
  • httpie使用详解
  • javascript数组去重/查找/插入/删除
  • jQuery(一)
  • Linux Process Manage
  • Lsb图片隐写
  • React的组件模式
  • Spring-boot 启动时碰到的错误
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 驱动程序原理
  • 如何合理的规划jvm性能调优
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​ssh免密码登录设置及问题总结
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (二)斐波那契Fabonacci函数
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (十八)Flink CEP 详解
  • (十五)使用Nexus创建Maven私服
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (游戏设计草稿) 《外卖员模拟器》 (3D 科幻 角色扮演 开放世界 AI VR)
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转载)Linux网络编程入门
  • .htaccess 强制https 单独排除某个目录
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET COER+CONSUL微服务项目在CENTOS环境下的部署实践
  • .NET CORE 第一节 创建基本的 asp.net core