python操作mysql数据库(百库百表)
发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,问题描述:今天下午跑某项目db需求,百库百表清脏数据,然后自己写了个python脚本,跑完之后通知项目,然后项目给玩家发奖励了,结果悲催了,所有的mysql操作没有执行成功(没有报错,因而以为执行成功
千家信息网最后更新 2025年02月01日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安全错误
数据库的锁怎样保障安全
万方数据库的期刊高级检索条件
兰州网络安全管理员培训班
张小豆手机版服务器
反诈小故事网络安全在行动
数据库不够用
威动服务器影片命名规则
360回应美国网络安全大脑
ipfs四币循环软件开发
WCDMA网络安全黑板报
网络安全舆论引导
测试自动生成数据库
网络安全审办办法
魔兽世界单机服务器代码
软件开发设计与管理工资
云服务器显示未激活
天津诚信网络技术咨询创新服务
浪潮服务器管理口禁止访问
丢手机数据库
陕西宜兴软件开发
翔安租房软件开发
营业执照网络技术服务业务
江阴大型软件开发项目信息
数据库不够用
共青团大学生网络安全知识竞赛
数据库管理现状
农村土地信息数据库
站群服务器联系火-星下拉8
h2数据库and
郑州网牧网络技术有限公司
服务器发烧