問題描述:
今天下午跑某項目db需求,百庫百表清臟數(shù)據(jù),然后自己寫了個python腳本,跑完之后通知項目,然后項目給玩家發(fā)獎勵了,結(jié)果悲催了,所有的MySQL操作沒有執(zhí)行成功(沒有報錯,因而以為執(zhí)行成功)。
以下是我的python腳本,傳兩個文件作為參數(shù),host.txt 以及 update.sql
點擊(此處)折疊或打開
創(chuàng)新互聯(lián)公司成立與2013年,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元回民做網(wǎng)站,已為上家服務(wù),為回民各地企業(yè)和個人服務(wù),聯(lián)系電話: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);
host.txt如下:
每執(zhí)行一條語句都print出來,結(jié)果是成功打印出了10000條,但是上庫看binlog日志并沒有任何記錄,數(shù)據(jù)也沒有變化
解決:
臨時寫了個shell腳本,跑完需求,成功執(zhí)行。
其中傳入的$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
發(fā)現(xiàn)問題:
開始以為自己遠端沒有執(zhí)行,然后重新在test庫上使用以上python腳本create百表,登上去查看,發(fā)現(xiàn)操作成功。
但是insert、update、以及delete操作無效。
查資料得知,mysql的ddl操作是隱式提交的,而dml是需要顯示commit才能提交 成功,而我的這個python腳本沒有調(diào)用cursor.commit(),故而close之后并沒有提交相應(yīng)的操作。
這里要區(qū)分shell中連接執(zhí)行和python MySQLdb模塊中連接執(zhí)行的區(qū)別:
①shell中寫的是連接到庫上默認autocommit是開啟的,故而執(zhí)行時自動提交的,
②而pyrhon的該模塊在dml操作之后調(diào)用conn.commit()顯示提交或者在連接mysql之后執(zhí)行設(shè)置conn.autocommit(1)。這是由于MySQLdb模塊在連接mysql之后關(guān)閉了自動提交。需要注意的是這里針對的是innodb存儲引擎,因為mysaim不支持事務(wù)
本文標(biāo)題:python操作mysql數(shù)據(jù)庫(百庫百表)
分享網(wǎng)址:
http://weahome.cn/article/jpgocd.html