【问题标题】:Python, Tornado, TorMySQLPython,龙卷风,TorMySQL
【发布时间】:2018-11-16 22:13:12
【问题描述】:

我有一个基于 Python 2.7 和 Tornado 框架的大型旧项目。为了使用 MySQL,它最初使用 Tornado-MySQL 和原始 SQL 查询,并且运行良好,但现在它必须使用 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 的类似但更简单的代码完全完美,但仅适用于 MySQL 5.7。

但是,似乎跳过了一些 UPDATE / INSERT 查询,我收到以下消息:

(1213, u'尝试获取锁时发现死锁;尝试重启事务')

WARNING:root:Connection 可能没有释放,使用时间 25.32s {'port': 3306, 'host': '127.0.0.1', 'user': '...', 'database': '.. .'} .

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

如何解决问题?

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

【问题讨论】:

    标签: python mysql tornado


    【解决方案1】:

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

    我认为大多数用户习惯于默认“自动提交”,但这似乎不是 TorMySQL 的默认模式

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 2017-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多