我有一个基于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()
1条答案
按热度按时间xyhw6mcr1#
即使在选择查询之后,您可能也必须conn.commit()——否则,选择查询的运行将在第一个事务中完成。
我认为大多数用户习惯于默认的“autocommit”,但这似乎不是tormysql的默认模式
(在使用tormysql的头几天,我和你一样感到困惑:)