在使用之前需要先安装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 = False
return cnx
except 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 None
def 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_statements
def update_org_code(cursor, table):
"""
更新 org_code 字段(此方法用于对追加的字段填充数据,可根据具体需求进行改造)
:param cursor: 游标
:param table: 表
:return: 空
"""
update_statement = f"""
UPDATE {table} t
JOIN sys_dept d ON t.dept_id = d.dept_id
SET 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:
return
print("开始修改...")
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代码处理的事情,只是我们日常开发中遇到问题的一个缩影,大家可以根据自己的具体需求,进行修改。最重要的是要清楚自己想解决的问题是什么,如何借助工具更好地去解决问题,从而提升自己的工作效率。