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 的头几天,我和你一样感到困惑:)
我有一个基于 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 的头几天,我和你一样感到困惑:)