python运作mysql数据库
发布时间:2022-03-28 14:54:33 所属栏目:MySql教程 来源:互联网
导读:问题描述: 今天下午跑某项目db需求,百库百表清脏数据,然后自己写了个python脚本,跑完之后通知项目,然后项目给玩家发奖励了,结果悲催了,所有的mysql操作没有执行成功(没有报错,因而以为执行成功)。 以下是我的python脚本,传两个文件作为参数,host
问题描述: 今天下午跑某项目db需求,百库百表清脏数据,然后自己写了个python脚本,跑完之后通知项目,然后项目给玩家发奖励了,结果悲催了,所有的mysql操作没有执行成功(没有报错,因而以为执行成功)。 以下是我的python脚本,传两个文件作为参数,host.txt 以及 update.sql 点击(此处)折叠或打开 #!/usr/bin/env python # -*- coding: UTF-8 -*- 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') 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') 192.168.xx.xx 3306 每执行一条语句都print出来,结果是成功打印出了10000条,但是上库看binlog日志并没有任何记录,数据也没有变化 发现问题: 开始以为自己远端没有执行,然后重新在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不支持事务。 (编辑:大连站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐