python操作mysql数据库(百库百表)
发表于:2024-11-28 作者:千家信息网编辑
千家信息网最后更新 2024年11月28日,问题描述:今天下午跑某项目db需求,百库百表清脏数据,然后自己写了个python脚本,跑完之后通知项目,然后项目给玩家发奖励了,结果悲催了,所有的mysql操作没有执行成功(没有报错,因而以为执行成功
千家信息网最后更新 2024年11月28日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安全错误
数据库的锁怎样保障安全
和网络安全有关的班会记录
游戏数据库表设计
软件开发公司的绩效管理制度
数据库的四种打开方式为
数据库数量
青海网络技术开发信息中心
药监局医疗器械唯一标识数据库
数据库指纹比对开发
沈阳直播软件开发多少钱
初中班主任网络安全教育
手机配色软件开发公司
怎样登录香肠派对里面服务器
威海亿汇软件开发公司
数据库工程师需要掌握哪些技术
网络安全调查表
公职人员网络安全观后感
深圳通讯软件开发供应商
数据库三种基本运算
数据库技术与应用第三版实验
网络安全的四大体系
app软件开发技术转让
u8数据库备份恢复
服务器访问自身ip
cklid提示链接服务器失败
我的世界免费32k服务器最新
网站查询服务器www
高级软件开发师证考试多少分
com服务器 IP地址
高二会考计算机网络技术运用
jira连接数据库设置