一,Python2.x迁移到3.x问题
1,torndb不支持3.x,在3.x环境下报错解决方案
torndb模块是不支持python3.x,所以需要修改部分torndb源码即可正常使用
源码修改:
1,修改导入模块
import pymysql.connections
import pymysql.converters
import pymysql.cursors
# import MySQLdb.constants
# import MySQLdb.converters
# import MySQLdb.cursors
2,修改连接mysql的方式
def reconnect(self):
"""Closes the existing database connection and re-opens it."""
# self.close()
# self._db = MySQLdb.connect(**self._db_args)
# self._db.autocommit(True)
self.close()
self._db = pymysql.connect(**self._db_args) # MySQLdb.connect(**self._db_args)
self._db.autocommit(True)
3,修改连接参数
# if MySQLdb is not None:
if pymysql is not None:
# Fix the access conversions to properly recognize unicode/binary
# FIELD_TYPE = MySQLdb.constants.FIELD_TYPE
# FLAG = MySQLdb.constants.FLAG
# CONVERSIONS = copy.copy(MySQLdb.converters.conversions)
#
# field_types = [FIELD_TYPE.BLOB, FIELD_TYPE.STRING, FIELD_TYPE.VAR_STRING]
# if 'VARCHAR' in vars(FIELD_TYPE):
# field_types.append(FIELD_TYPE.VARCHAR)
#
# for field_type in field_types:
# CONVERSIONS[field_type] = [(FLAG.BINARY, str)] + CONVERSIONS[field_type]
#
# # Alias some common MySQL exceptions
# IntegrityError = MySQLdb.IntegrityError
# OperationalError = MySQLdb.OperationalError
FIELD_TYPE = pymysql.connections.FIELD_TYPE
FLAG = pymysql.constants.FLAG
CONVERSIONS = copy.copy(pymysql.converters.conversions)
field_types = [FIELD_TYPE.BLOB, FIELD_TYPE.STRING, FIELD_TYPE.VAR_STRING]
if 'VARCHAR' in vars(FIELD_TYPE):
field_types.append(FIELD_TYPE.VARCHAR)
for field_type in field_types:
CONVERSIONS[field_type] = [(FLAG.BINARY, str)].append(CONVERSIONS[field_type])
IntegrityError = pymysql.IntegrityError
OperationalError = pymysql.OperationalError
4,修改连接超时时间,在torndb初始化方法中设置,需要传递给pymysq
def __init__(self, host, database, user=None, password=None,
max_idle_time = 7 * 3600, connect_timeout = 10, # 设置连接超时时间,时间是秒
time_zone = "+0:00", charset = "utf8", sql_mode = "TRADITIONAL"):
5,修改查询方法中的迭代方法
def query(self, query, *parameters, **kwparameters):
# """Returns a row list for the given query and parameters."""
# cursor = self._cursor()
# try:
# self._execute(cursor, query, parameters, kwparameters)
# column_names = [d[0] for d in cursor.description]
# return [Row(itertools.izip(column_names, row)) for row in cursor]
# finally:
# cursor.close()
"""Returns a row list for the given query and parameters."""
cursor = self._cursor()
try:
self._execute(cursor, query, parameters, kwparameters)
column_names = [d[0] for d in cursor.description]
return [Row(itertools.zip_longest(column_names, row)) for row in cursor]
finally:
cursor.close()
至此python3.x已经能够正常使用torndb