python、tornado、tormysql

r6hnlfcb  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(326)

我有一个基于python2.7和tornado框架的大型老项目。为了使用mysql,它最初在原始sql查询中使用tornadomysql,效果很好,但现在必须使用mysql 8,而且这个库已经过时,没有维护。
所以,现在我设置了tormysql库–它与mysql server8连接得很好,但我不完全了解如何使用它,这导致了很多错误。
在一个项目的文件中,我编写了访问数据库的代码:

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是因为这个函数是用不同类型的查询调用的。我知道,很难看,但效果不错。类似的,但更简单的代码龙卷风mysql工作完全完美,但只有MySQL5.7。
然而,一些 UPDATE / INSERT 查询似乎被跳过,我得到以下消息:
(1213,尝试获取锁时发现u'deadlock;尝试重新启动事务')
warning:root:连接可能未释放,使用时间25.32s{'port':3306,'host':'127.0.0.1','user':'…','database':'…'}<3,2>。
此外,有时服务器的不同客户端会看到不同版本的数据,就像它们与自己的未提交数据有不同的连接一样。
如何解决这个问题?
我想游泳池的问题是-也许我必须关闭/重新创建它?tormysql页面也有这样一行: yield pool.close()

xyhw6mcr

xyhw6mcr1#

即使在选择查询之后,您可能也必须conn.commit()——否则,选择查询的运行将在第一个事务中完成。
我认为大多数用户习惯于默认的“autocommit”,但这似乎不是tormysql的默认模式
(在使用tormysql的头几天,我和你一样感到困惑:)

相关问题