python操作mysql数据库(百库百表)
发表于:2025-11-10 作者:千家信息网编辑
千家信息网最后更新 2025年11月10日,问题描述:今天下午跑某项目db需求,百库百表清脏数据,然后自己写了个python脚本,跑完之后通知项目,然后项目给玩家发奖励了,结果悲催了,所有的mysql操作没有执行成功(没有报错,因而以为执行成功
千家信息网最后更新 2025年11月10日python操作mysql数据库(百库百表)问题描述:
今天下午跑某项目db需求,百库百表清脏数据,然后自己写了个python脚本,跑完之后通知项目,然后项目给玩家发奖励了,结果悲催了,所有的mysql操作没有执行成功(没有报错,因而以为执行成功)。
以下是我的python脚本,传两个文件作为参数,host.txt 以及 update.sql
update.sql如下:
解决:
临时写了个shell脚本,跑完需求,成功执行。
其中传入的$1为包含10000条操作的delete语句文件
发现问题:
开始以为自己远端没有执行,然后重新在test库上使用以上python脚本create百表,登上去查看,发现操作成功。
但是insert、update、以及delete操作无效。
查资料得知,mysql的ddl操作是隐式提交的,而dml是需要显示commit才能提交 成功,而我的这个python脚本没有调用cursor.commit(),故而close之后并没有提交相应的操作。
这里要区分shell中连接执行和python MySQLdb模块中连接执行的区别:
①shell中写的是连接到库上默认autocommit是开启的,故而执行时自动提交的,
②而pyrhon的该模块在dml操作之后调用conn.commit()显示提交或者在连接mysql之后执行设置conn.autocommit(1)。这是由于MySQLdb模块在连接mysql之后关闭了自动提交。需要注意的是这里针对的是innodb存储引擎,因为mysaim不支持事务
今天下午跑某项目db需求,百库百表清脏数据,然后自己写了个python脚本,跑完之后通知项目,然后项目给玩家发奖励了,结果悲催了,所有的mysql操作没有执行成功(没有报错,因而以为执行成功)。
以下是我的python脚本,传两个文件作为参数,host.txt 以及 update.sql
点击(此处)折叠或打开
- #!/usr/bin/env python
- # -*- coding: UTF-8 -*-
- import sys
- import MySQLdb
- import datetime
- dbuser = 'xxx'
- dbpwd = 'xxx'
- DB_NUM = 100
- TB_NUM = 100
- args = sys.argv
- if len(args)!=3:
- print "USAGE: %s host.txt update.sql" % args[0]
- sys.exit()
- start = datetime.datetime.now()
- print "Start Time : %s " % start.strftime('%Y-%m-%d %H:%M:%S')
- hostfile = args[1]
- sqlfile = args[2]
- rhost = open(hostfile)
- hostlist = rhost.readlines()
- rhost.close()
- rsqls = open(sqlfile)
- sqllist = rsqls.readlines()
- rsqls.close()
- for host in hostlist:
- host = host.strip()
- ip = host.split(' ')[0]
- pt = host.split(' ')[1]
- conn = MySQLdb.connect(ip,dbuser,dbpwd,port=int(pt))
- cursor = conn.cursor()
- cursor.execute('SET NAMES UTF8')
- sqls = []
- for i in range(DB_NUM):
- sqls.append("%s" % str(i).zfill(2))
- for sql in sqls:
- db=sql
- #print 'ip=%s ; port=%s ; db=%s' % (ip,pt,db)
- for j in range(TB_NUM):
- if TB_NUM > 10:
- j = str(j).zfill(2)
- for sql in sqllist:
- ct = sql.strip() % (db,str(j))
- cursor.execute(ct)
- print ct
- conn.close()
- end= datetime.datetime.now()
- print "End Time : %s " % end.strftime('%Y-%m-%d %H:%M:%S')
update.sql如下:
点击(此处)折叠或打开
- delete from XSY_%s.t_xsy_equip_cloth_%s where (clothid >= 201675 and clothid <= 201700) or (clothid >= 201725 and clothid <= 201751);
点击(此处)折叠或打开
- 192.168.xx.xx 3306
解决:
临时写了个shell脚本,跑完需求,成功执行。
其中传入的$1为包含10000条操作的delete语句文件
点击(此处)折叠或打开
- #!/bin/bash
- user=xxx
- pwd=xxx
- while read sql
- do
- echo $sql
- /usr/bin/mysql -h"192.168.xxx.xx" -P3306 -utab -ptab -e "${sql}"
- done < $1
发现问题:
开始以为自己远端没有执行,然后重新在test库上使用以上python脚本create百表,登上去查看,发现操作成功。
但是insert、update、以及delete操作无效。
查资料得知,mysql的ddl操作是隐式提交的,而dml是需要显示commit才能提交 成功,而我的这个python脚本没有调用cursor.commit(),故而close之后并没有提交相应的操作。
这里要区分shell中连接执行和python MySQLdb模块中连接执行的区别:
①shell中写的是连接到库上默认autocommit是开启的,故而执行时自动提交的,
②而pyrhon的该模块在dml操作之后调用conn.commit()显示提交或者在连接mysql之后执行设置conn.autocommit(1)。这是由于MySQLdb模块在连接mysql之后关闭了自动提交。需要注意的是这里针对的是innodb存储引擎,因为mysaim不支持事务
成功
脚本
模块
项目
数据
文件
结果
语句
问题
需求
两个
事务
参数
引擎
日志
玩家
资料
这是
UTF-8
变化
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
文件连接服务器时出现问题
商品网站数据库模型
网络安全第60条规定
网络安全手抄报你看
青浦区手机软件开发创新服务
shell数据库mysql
山东大树网络技术有限公司
江苏计算机网络技术转本院校
服务器光口网卡mac
微库创展互联网科技7
传奇3手游服务器搭建教程
如何练习计算机网络技术
网络安全积极的一面
网络安全比赛参赛
网络安全是指保护系统
个性化网络安全管理
达梦数据库支持2012系统吗
苹果服务器shsh
安徽交通软件开发定制公司
打拐数据库是什么时候成立的
东营智能养老软件开发哪儿好
计算机网络安全学生上机实验
深圳web前端软件开发哪家实惠
软件开发岗位招聘问题
服务器证书属于数字证书吗
键值类型数据库
时序库服务器
四川企业软件开发外包
申请访问qq空间去服务器繁忙
中技计算机网络技术必考证