欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Python中MySQLdb和torndb模塊對MySQL的斷連問題處理

系統 2072 0

在使用python 對wordpress tag 進行細化代碼處理時,遇到了調用MySQLdb模塊時的出錯,由于錯誤提示和問題原因相差甚遠,查看了N久代碼也未發現代碼有問題。后來問了下師傅,被告知MySQLdb里有一個斷接的坑 ,需要進行數據庫重連解決。

一、報錯代碼及提示

運行出錯的代碼如下:

            
import MySQLdb
def getTerm(db,tag):
    cursor = db.cursor()
    query = "SELECT term_id FROM wp_terms where name=%s "
    count = cursor.execute(query,tag)
    rows = cursor.fetchall()
    db.commit()
    #db.close()
    if count:
        term_id = [int(rows[id][0]) for id in range(count)]
        return term_id
    else:return None
def addTerm(db,tag):
    cursor = db.cursor()
    query = "INSERT into wp_terms (name,slug,term_group) values (%s,%s,0)"
    data = (tag,tag)
    cursor.execute(query,data)
    db.commit()
    term_id = cursor.lastrowid
    sql = "INSERT into wp_term_taxonomy (term_id,taxonomy,description) values (%s,'post_tag',%s) "
    value = (term_id,tag)
    cursor.execute(sql,value)
    db.commit()
    db.close()
    return int(term_id)
dbconn = MySQLdb.connect(host='localhost', user='root', passwd='123456', db='361way', port=3306, charset='utf8', init_command='set names utf8')
tags = ['mysql','1111','aaaa','bbbb','ccccc','php','abc','python','java']
tagids = []
for tag in tags:
    termid = getTerm(dbconn,tag)
    if termid:
        print tag, 'tag id is ',termid
        tagids.extend(termid)
    else:
        termid = addTerm(dbconn,tag)
        print 'add tag',tag,'id is ' ,termid
        tagids.append(termid)
print 'tag id is ',tagids

          

直接可以執行,在第for循環里第二次調用getTerm函數時,報錯如下:

            
Traceback (most recent call last):
 File "a.py", line 40, in 
            
              
  termid = getTerm(dbconn,tag)
 File "a.py", line 11, in getTerm
  count = cursor.execute(query,tag)
 File "/usr/lib64/python2.6/site-packages/MySQLdb/cursors.py", line 154, in execute
  charset = db.character_set_name()
_mysql_exceptions.InterfaceError: (0, '')


            
          

二、解決方法

初始時以為是編碼問題了,又細核對了幾遍未發現編碼有問題,在python代碼里也未發現異常。后來問過師傅后,師傅來了句提示:

只看代碼有啥用,mysql 的超時時間調長點或捕獲異常從連,原因是
cursor. connection 沒有關閉
但是socket已經斷了
cursor 這個行為不會再建立一次socket的
重新執行一次MysqlDB.connect()
看的有點懵懂,先從mysql 里查看了所有timeout相關的變量

            
mysql> show GLOBAL VARIABLES like "%timeout%";

          
            
+----------------------------+-------+
| Variable_name       | Value |
+----------------------------+-------+
| connect_timeout      | 10  |
| delayed_insert_timeout   | 300  |
| innodb_lock_wait_timeout  | 50  |
| innodb_rollback_on_timeout | OFF  |
| interactive_timeout    | 28800 |
| net_read_timeout      | 30  |
| net_write_timeout     | 60  |
| slave_net_timeout     | 3600 |
| table_lock_wait_timeout  | 50  |
| wait_timeout        | 28800 |
+----------------------------+-------+
10 rows in set (0.00 sec)

          

發現最小的超時時間是10s ,而我的程序執行起來顯然就不了10s 。因為之前查過相關的報錯,這里估計這個很可能是另外一個報錯:2006,MySQL server has gone away? 。即然和這個超時時間應該沒關系,那就嘗試通過MySQLdb ping測試,如果捕獲異常,就再進行重連,修改后的代碼為:

            
#!/usr/bin/python
#coding=utf-8
import MySQLdb
def getTerm(db,tag):
 cursor = db.cursor()
 query = "SELECT term_id FROM wp_terms where name=%s "
 count = cursor.execute(query,tag)
 rows = cursor.fetchall()
 db.commit()
 #db.close()
 if count:
 term_id = [int(rows[id][0]) for id in range(count)]
 print term_id
 return term_id
 else:return None
def addTerm(db,tag):
 cursor = db.cursor()
 query = "INSERT into wp_terms (name,slug,term_group) values (%s,%s,0)"
 data = (tag,tag)
 cursor.execute(query,data)
 db.commit()
 term_id = cursor.lastrowid
 sql = "INSERT into wp_term_taxonomy (term_id,taxonomy,description) values (%s,'post_tag',%s) "
 value = (term_id,tag)
 cursor.execute(sql,value)
 db.commit()
 db.close()
 return int(term_id)
dbconn = MySQLdb.connect(host='localhost', user='root', passwd='123456', db='361way', port=3306, charset='utf8', init_command='set names utf8')
tags = ['mysql','1111','aaaa','bbbb','ccccc','php','abc','python','java']
if __name__ == "__main__":
 tagids = []
 for tag in tags:
 try:
   dbconn.ping()
 except:
  print 'mysql connect have been close'
   dbconn = MySQLdb.connect(host='localhost', user='root', passwd='123456', db='361way', port=3306, charset='utf8', init_command='set names utf8')
 termid = getTerm(dbconn,tag)
 if termid:
  print tag, 'tag id is ',termid
  tagids.extend(termid)
 else:
  termid = addTerm(dbconn,tag)
  print 'add tag',tag,'id is ' ,termid
  tagids.append(termid)
 print 'All tags id is ',tagids

          

再執行發現竟然OK了,而細看下結果,發現基本上每1-2次getTerm或addTerm函數調用就會打印一次'mysql connect have been close' 。

三、使用torndb模塊解決mysql斷連問題
1.MySQLdb和torndb的代碼樣例對比
torndb是facebook開源的一個基于MySQLdb二次封裝的一個mysql模塊,新封裝的這個模塊比較小,是一個只有2百多行代碼的py文件。雖然代碼短,功能確相較MySQLdb簡便不少,并且該模塊由于增加了reconnect方法和max_idel_time參數,解決了mysql的斷連問題。比較下使用原生MySQLdb模塊和使用torndb模塊的代碼:
使用MySQLdb模塊的代碼

            
import MySQLdb
def getTerm(db,tag):
    cursor = db.cursor()
    query = "SELECT term_id FROM wp_terms where name=%s "
    count = cursor.execute(query,tag)
    rows = cursor.fetchall()
    db.commit()
    #db.close()
    if count:
        term_id = [int(rows[id][0]) for id in range(count)]
        return term_id
    else:return None
def addTerm(db,tag):
    cursor = db.cursor()
    query = "INSERT into wp_terms (name,slug,term_group) values (%s,%s,0)"
    data = (tag,tag)
    cursor.execute(query,data)
    db.commit()
    term_id = cursor.lastrowid
    sql = "INSERT into wp_term_taxonomy (term_id,taxonomy,description) values (%s,'post_tag',%s) "
    value = (term_id,tag)
    cursor.execute(sql,value)
    db.commit()
    db.close()
    return int(term_id)
def addCTag(db,data):
    cursor = db.cursor()
    query = '''INSERT INTO `wp_term_relationships` (
      `object_id` ,
      `term_taxonomy_id`
      )
      VALUES (
      %s, %s) '''
    cursor.executemany(query,data)
    db.commit()
    db.close()
dbconn = MySQLdb.connect(host='localhost', user='root', passwd='123456', db='361way', port=3306, charset='utf8', init_command='set names utf8')
tags = ['mysql','1111','aaaa','bbbb','ccccc','php','abc','python','java']
tagids = []
for tag in tags:
    if termid:
        try:
         dbconn.ping()
        except:
         dbconn = MySQLdb.connect(host='localhost', user='root', passwd='123456', db='361way', port=3306, charset='utf8', init_command='set names utf8')
         print tag, 'tag id is ',termid
        termid = getTerm(dbconn,tag)
        tagids.extend(termid)
    else:
        try:
         dbconn.ping()
        except:
         dbconn = MySQLdb.connect(host='localhost', user='root', passwd='123456', db='361way', port=3306, charset='utf8', init_command='set names utf8')
        termid = addTerm(dbconn,tag)
        print 'add tag',tag,'id is ' ,termid
        tagids.append(termid)
print 'tag id is ',tagids
postid = '35'
tagids = list(set(tagids))
ctagdata = []
for tagid in tagids:
  ctagdata.append((postid,tagid))
try:
  dbconn.ping()
except:
  dbconn = MySQLdb.connect(host='localhost', user='root', passwd='123456', db='361way', port=3306, charset='utf8', init_command='set names utf8')
  addCTag(dbconn,ctagdata)

          

使用torndb的代碼

            
#!/usr/bin/python
#coding=utf-8
import torndb
def getTerm(db,tag):
    query = "SELECT term_id FROM wp_terms where name=%s "
    rows = db.query(query,tag)
    termid = []
    for row in rows:
      termid.extend(row.values())
    return termid
def addTerm(db,tag):
    query = "INSERT into wp_terms (name,slug,term_group) values (%s,%s,0)"
    term_id = db.execute_lastrowid(query,tag,tag)
    sql = "INSERT into wp_term_taxonomy (term_id,taxonomy,description) values (%s,'post_tag',%s) "
    db.execute(sql,term_id,tag)
    return term_id
def addCTag(db,data):
    query = "INSERT INTO wp_term_relationships (object_id,term_taxonomy_id) VALUES (%s, %s) "
    db.executemany(query,data)
dbconn = torndb.Connection('localhost:3306','361way',user='root',password='123456')
tags = ['mysql','1111','aaaa','bbbb','ccccc','php','abc','python','java']
tagids = []
for tag in tags:
  termid = getTerm(dbconn,tag)
  if termid:
    print tag, 'tag id is ',termid
    tagids.extend(termid)
  else:
    termid = addTerm(dbconn,tag)
    print 'add tag',tag,'id is ' ,termid
    tagids.append(termid)
print 'All tags id is ',tagids
postid = '35'
tagids = list(set(tagids))
ctagdata = []
for tagid in tagids:
  ctagdata.append((postid,tagid))
addCTag(dbconn,ctagdata)

          

從兩者的代碼上來看,使用torndb模塊和原生相比,發現可以省略如下兩部分:

torndb模塊不需要db.cursor進行處理,無不需要db.comment提交,torndb是自動提交的;

torndb不需要在每次調用時,進行db.ping()判斷數據庫socket連接是否斷開,因為torndb增加了reconnect方法,支持自動重連。

2.torndb的方法

torndb提供的參數和方法有:

execute????????????????????? 執行語句不需要返回值的操作。
execute_lastrowid??????????? 執行后獲得表id,一般用于插入后獲取返回值。
executemany????????????????? 可以執行批量插入。返回值為第一次請求的表id。
executemany_rowcount???????? 批量執行。返回值為第一次請求的表id。
get????????????????????????? 執行后獲取一行數據,返回dict。
iter???????????????????????? 執行查詢后,返回迭代的字段和數據。
query??????????????????????? 執行后獲取多行數據,返回是List。
close??????????????????????? 關閉
max_idle_time??????????????? 最大連接時間
reconnect??????????????????? 關閉后再連接
使用示例:

            
mysql> CREATE TABLE `ceshi` (`id` int(1) NULL AUTO_INCREMENT ,`num` int(1) NULL ,PRIMARY KEY (`id`));

          
              
>>> import torndb
>>> db = torndb.Connection("127.0.0.1","數據庫名","用戶名", "密碼", 24*3600)  # 24*3600為超時時間
>>> get_id1 = db.execute_lastrowid("insert ceshi(num) values('1')")
>>> print get_id1
1
>>> args1 = [('2'),('3'),('4')]
>>> get1 = db.executemany("insert ceshi(num) values(%s)", args1)
>>> print get1
2
>>> rows = db.iter("select * from ceshi")
>>> for i in rows:
… print i

            
3.報錯

在使用過程中可能遇到的錯誤:

            
 File "/home/361way/database.py", line 145, in execute_lastrowid
  self._execute(cursor, query, parameters)
 File "/home/361way/database.py", line 207, in _execute
  return cursor.execute(query, parameters)
 File "/usr/lib/pymodules/python2.7/MySQLdb/cursors.py", line 159, in execute
  query = query % db.literal(args)
TypeError: not enough arguments for format string

          

寫上面的代碼時,我剛開始還是試著使用MySQLdb模塊的方式引用數據,結果發現報參數的錯誤 ,經查看代碼發現 ,torndb在使用幾個sql方法時較MySQLdb精簡過了。具體各個方法的傳參方法如下(注意參數個數):

            
close()
reconnect()
iter(query, *parameters, **kwparameters)
query(query, *parameters, **kwparameters)
get(query, *parameters, **kwparameters)
execute(query, *parameters, **kwparameters)
execute_lastrowid(query, *parameters, **kwparameters)
execute_rowcount(query, *parameters, **kwparameters)
executemany(query, parameters)
executemany_lastrowid(query, parameters)
executemany_rowcount(query, parameters)
update(query, *parameters, **kwparameters)
updatemany(query, parameters)
insert(query, *parameters, **kwparameters)
insertmany(query, parameters)

          


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产成人免费网站 | 亚洲欧洲日韩国产 | 日韩精品中文乱码在线观看 | 九九综合九九 | 欧美黑人狂野猛交老妇 | 免费无码毛片一区二区A片 成人18网站 | 国产三级在线视频播放线 | 四月婷婷七月婷婷综合 | 亚洲天堂久久精品成人 | 精品久久中文字幕 | 亚洲一区二区视频在线观看 | 日韩男女做性高清在线观看 | 日产一一到六区麻豆 | a毛片视频网站 | 中文字幕日韩在线 | 一级做a爰片久久毛片 | 五月天色婷婷在线 | 三级高清 | 2020国产精品视频免费 | 日韩三级免费 | 亚洲精品成人 | 亚洲精品久久久久无码AV片软件 | 大香萑75久久精品免费 | 大学生一级毛片全黄毛片黄 | 国产九九精品 | 欧美精品www | 成人免费xxxxx在线观看 | 亚洲永久 | 国产中文字幕一区 | 爱爱视频在线观看 | 一区二区免费在线 | 久久成人一区 | 亚洲国产成人久久综合碰 | 羞羞视频免费网站在线看 | 成人免费看片视频 | 欧美日韩在线一区 | 5月激情网| 亚洲99影视一区二区三区 | 亚洲91在线 | 欧美成人一级 | 成人激情综合网 |