我有一个基于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/

10-11 15:17