python操作mysql数据库(百库百表)
                                            
                                                
            问题描述:
今天下午跑某项目db需求,百库百表清脏数据,然后自己写了个python脚本,跑完之后通知项目,然后项目给玩家发奖励了,结果悲催了,所有的MySQL操作没有执行成功(没有报错,因而以为执行成功)。
以下是我的python脚本,传两个文件作为参数,host.txt 以及 update.sql
    
						
update.sql如下:
						host.txt如下:
						每执行一条语句都print出来,结果是成功打印出了10000条,但是上库看binlog日志并没有任何记录,数据也没有变化
解决:
临时写了个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不支持事务
    
                
            
                                                            
名称栏目:python操作mysql数据库(百库百表)
本文网址:http://www.scyingshan.cn/article/jpgocd.html
                                            
                                        今天下午跑某项目db需求,百库百表清脏数据,然后自己写了个python脚本,跑完之后通知项目,然后项目给玩家发奖励了,结果悲催了,所有的MySQL操作没有执行成功(没有报错,因而以为执行成功)。
以下是我的python脚本,传两个文件作为参数,host.txt 以及 update.sql
点击(此处)折叠或打开

创新互联公司成立与2013年,是专业互联网技术服务公司,拥有项目网站建设、成都网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元回民做网站,已为上家服务,为回民各地企业和个人服务,联系电话:18980820575
- 
				#!/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不支持事务
名称栏目:python操作mysql数据库(百库百表)
本文网址:http://www.scyingshan.cn/article/jpgocd.html

 建站
建站
 咨询
咨询 售后
售后
 建站咨询
建站咨询 
 