您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python中MySQLdb和torndb模块对MySQL的断连问题处理

5b51 2022/1/14 8:18:19 python 字数 18662 阅读 366 来源 www.jb51.cc/python

在使用python对wordpresstag进行细化代码处理时,遇到了调用MySQLdb模块时的出错,由于错误提示和问题原因相差甚远,查看了N久代码也未发现代码有问题。后来问了下师傅,被告知MySQLdb里有一个断接的坑,需要进行数据

概述

在使用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函数时,报错如下:

二、解决方法

初始时以为是编码问题了,又细核对了几遍未发现编码有问题,在python代码里也未发现异常。后来问过师傅后,师傅来了句提示

只看代码有啥用,MysqL 的超时时间调长点或捕获异常从连,原因是
cursor. connection 没有关闭
但是socket已经断了
cursor 这个行为不会再建立一次socket的
重新执行一次MysqLDB.connect()
看的有点懵懂,先从MysqL 里查看了所有timeout相关的变量

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

发现最小的超时时间是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,0)"
 data = (tag,tag)
 cursor.execute(query,data)
 db.commit()
 term_id = cursor.lastrowid
 sql = "INSERT into wp_term_taxonomy (term_id,%s) "
 value = (term_id,tag)
 cursor.execute(sql,value)
 db.commit()
 db.close()
 return int(term_id)
dbconn = MysqLdb.connect(host='localhost','java']
if __name__ == "__main__":
 tagids = []
 for tag in tags:
 try:
   dbconn.ping()
 except:
  print 'MysqL connect have been close'
   dbconn = MysqLdb.connect(host='localhost',init_command='set names utf8')
 termid = getTerm(dbconn,tag)
 if termid:
  print tag,termid
  tagids.extend(termid)
 else:
  termid = addTerm(dbconn,tag)
  print 'add tag',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,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','java']
tagids = []
for tag in tags:
    if termid:
        try:
         dbconn.ping()
        except:
         dbconn = MysqLdb.connect(host='localhost',init_command='set names utf8')
         print tag,termid
        termid = getTerm(dbconn,tag)
        tagids.extend(termid)
    else:
        try:
         dbconn.ping()
        except:
         dbconn = MysqLdb.connect(host='localhost',init_command='set names utf8')
        termid = addTerm(dbconn,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',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,0)"
    term_id = db.execute_lastrowid(query,tag)
    sql = "INSERT into wp_term_taxonomy (term_id,%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',password='123456')
tags = ['MysqL','java']
tagids = []
for tag in tags:
  termid = getTerm(dbconn,tag)
  if termid:
    print tag,termid
    tagids.extend(termid)
  else:
    termid = addTerm(dbconn,tag)
    print 'add tag',termid
    tagids.append(termid)
print 'All tags id is ',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

在使用过程中可能遇到的错误

写上面的代码时,我刚开始还是试着使用MysqLdb模块的方式引用数据,结果发现报参数的错误 ,经查看代码发现 ,torndb在使用几个sql方法时较MysqLdb精简过了。具体各个方法的传参方法如下(注意参数个数):

总结

以上是编程之家为你收集整理的Python中MySQLdb和torndb模块对MySQL的断连问题处理全部内容,希望文章能够帮你解决Python中MySQLdb和torndb模块对MySQL的断连问题处理所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶