我有一个基于Python2.7和Tornado框架的大型旧项目。要使用MySQL,它最初对原始SQL查询使用Tornado-MySQL,并且运行良好,但现在它必须使用MySQL 8,而且该库已过时,未维护。
所以,现在我设置了TorMySQL库,它可以很好地连接到MySQL Server 8,但是我不完全理解如何使用它,这导致了很多错误。
在一个项目的文件中,我编写了以下代码以访问数据库:
from tornado import gen
from tornado.gen import Return
from tornado.ioloop import IOLoop
import tormysql
import settings
POOL = tormysql.ConnectionPool(
max_connections = 20,
idle_seconds = 7200, #timeout time, 0 is not timeout
wait_connection_timeout = 3,
host='127.0.0.1',
port=3306,
user=settings.MYSQL_USER,
passwd=settings.MYSQL_PASSWORD,
db='aivanf',
use_unicode=True,
charset='utf8mb4')
@gen.coroutine
def executePool(query, params):
with (yield POOL.Connection()) as conn:
with conn.cursor() as cursor:
try:
yield cursor.execute(query, params)
except Exception, ex:
print('Exception!\n{}'.format(ex))
yield conn.rollback()
raise Return(None)
else:
first = query[:10].lower()
if 'update' in first or 'insert' in first:
yield conn.commit()
if 'select' in first:
raise Return(cursor.fetchall())
else:
raise Return(None)
我使用if是因为这个函数是用不同类型的查询调用的。我知道,很难看,但效果很好。类似的,但更简单的代码为Tornado MySQL工作完全完美,但只与MySQL5.7。
但是,有些查询似乎被跳过,我得到以下消息:
(1213,尝试获取锁时发现u'死锁;尝试重新启动事务')
警告:根:连接可能未释放,使用时间25.32s{'port':3306,'host':'127.0.0.1,'user':'…','database':'…'}。
此外,有时服务器的不同客户端会看到不同版本的数据,比如它们与自己的未提交数据有不同的连接。
如何解决这个问题?
我想是游泳池的问题吧——也许我得把它关闭/重建一下?TorMySQL页面还有一行:
UPDATE
最佳答案
即使在SELECT查询之后,也可能需要conn.commit(),否则SELECT查询的运行将在第一个事务中完成。
我认为大多数用户习惯于默认的“自动提交”,但这似乎不是TorMySQL的默认模式
(在使用TorMySQL的头几天,我和你一样困惑:)
关于python - Python, Tornado ,TorMySQL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53346124/