Python、龙卷风、TorMySQL

Python, Tornado, TorMySQL

我有一个基于 Python 2.7 和 Tornado 框架的大型旧项目。要使用 MySQL,它最初使用 Tornado-MySQL 和原始 SQL 查询,并且运行良好,但现在它必须使用 MySQL 8,并且该库已过时,无人维护.

所以,现在我设置了 TorMySQL 库——它很好地连接到 MySQL 服务器 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's 是因为这个函数是用不同类型的查询调用的。我知道,这很丑陋,但效果很好。类似但更简单的 Tornado 代码-MySQL 工作完全完美,但仅适用于 MySQL 5.7。

但是,某些 UPDATE / INSERT 查询似乎被跳过了,我收到了这些消息:

(1213, u'Deadlock found when trying to get lock; try restarting transaction')

WARNING:root:Connection maybe not release, used time 25.32s {'port': 3306, 'host': '127.0.0.1', 'user': '...', 'database': '...'} <3,2>.

此外,有时服务器的不同客户端会看到不同版本的数据——就像他们与自己未提交的数据有不同的连接一样。

如何解决问题?

我想是关于池的问题——也许我必须关闭/重新创建它? TorMySQL 页面也有这一行:yield pool.close()

即使在 SELECT 查询之后,您可能也必须 conn.commit() - 否则 运行 的 SELECT 查询将在与第一个事务相同的事务中完成。

我认为大多数用户默认习惯于 "autocommit",但这似乎不是 TorMySQL 的默认模式

(在使用 TorMySQL 的头几天,我和你一样感到困惑:)