中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python操作mysql數據庫(百庫百表)

發布時間:2020-08-11 19:08:51 來源:ITPUB博客 閱讀:182 作者:Kind0f 欄目:MySQL數據庫
問題描述:
    今天下午跑某項目db需求,百庫百表清臟數據,然后自己寫了個python腳本,跑完之后通知項目,然后項目給玩家發獎勵了,結果悲催了,所有的mysql操作沒有執行成功(沒有報錯,因而以為執行成功)。

以下是我的python腳本,傳兩個文件作為參數,host.txt 以及 update.sql
    

點擊(此處)折疊或打開

  1. #!/usr/bin/env python
  2. -*- coding: UTF--*-


  3. import sys
  4. import MySQLdb
  5. import datetime



  6. dbuser = 'xxx'
  7. dbpwd = 'xxx'

  8. DB_NUM = 100
  9. TB_NUM = 100
  10. args = sys.argv
  11. if len(args)!=3:
  12.                 print "USAGE: %s host.txt update.sql" % args[0]
  13.                 sys.exit()

  14. start = datetime.datetime.now()
  15. print "Start Time : %s " % start.strftime('%Y-%m-%d %H:%M:%S')

  16. hostfile = args[1]
  17. sqlfile = args[2]

  18. rhost = open(hostfile)
  19. hostlist = rhost.readlines()
  20. rhost.close()


  21. rsqls = open(sqlfile)
  22. sqllist = rsqls.readlines()
  23. rsqls.close()

  24. for host in hostlist:
  25.                 host = host.strip()
  26.                 ip = host.split(' ')[0]
  27.                 pt = host.split(' ')[1]
  28.                 conn = MySQLdb.connect(ip,dbuser,dbpwd,port=int(pt))
  29.                 cursor = conn.cursor()
  30.                 cursor.execute('SET NAMES UTF8')

  31.                 sqls = []
  32.                 for i in range(DB_NUM):
  33.                         sqls.append("%s" % str(i).zfill(2))
  34.                 for sql in sqls:
  35.                         db=sql
  36.                         #print 'ip=%s ; port=%s ; db=%s' % (ip,pt,db)
  37.                         for j in range(TB_NUM):
  38.                                 if TB_NUM > 10:
  39.                                         j = str(j).zfill(2)
  40.                                 for sql in sqllist:
  41.                                         ct = sql.strip() % (db,str(j))
  42.                                         cursor.execute(ct)
  43.                                         print ct

  44.                 conn.close()
  45. end= datetime.datetime.now()
  46. print "End Time : %s " % end.strftime('%Y-%m-%d %H:%M:%S')

update.sql如下:

點擊(此處)折疊或打開

  1. delete from XSY_%s.t_xsy_equip_cloth_%where (clothid >= 201675 and clothid <= 201700) or (clothid >= 201725 and clothid <= 201751);
host.txt如下:

點擊(此處)折疊或打開

  1. 192.168.xx.xx 3306
每執行一條語句都print出來,結果是成功打印出了10000條,但是上庫看binlog日志并沒有任何記錄,數據也沒有變化

解決:
    臨時寫了個shell腳本,跑完需求,成功執行。
    其中傳入的$1為包含10000條操作的delete語句文件

點擊(此處)折疊或打開

  1. #!/bin/bash
  2. user=xxx
  3. pwd=xxx
  4. while read sql
  5. do
  6. echo $sql
  7. /usr/bin/mysql -h"192.168.xxx.xx" -P3306 -utab -ptab -e "${sql}"
  8. 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不支持事務
    
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

淮北市| 冕宁县| 志丹县| 平果县| 合水县| 新建县| 伊金霍洛旗| 武宁县| 晋城| 桃江县| 九龙县| 阿鲁科尔沁旗| 忻州市| 镇坪县| 牡丹江市| 皋兰县| 周口市| 南城县| 安西县| 普兰店市| 桂林市| 错那县| 曲松县| 丰宁| 弥勒县| 荔波县| 眉山市| 南华县| 兴义市| 平邑县| 云梦县| 淮北市| 阿巴嘎旗| 黑河市| 安多县| 田阳县| 汾阳市| 洱源县| 神池县| 全南县| 朔州市|