У меня есть старый, большой проект, основанный на 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, при попытке установить блокировку обнаружена блокировка; попробуйте перезапустить транзакцию)
ПРЕДУПРЕЖДЕНИЕ: root: Соединение может не освободиться, использованное время 25,32 с {'порт': 3306,' host ':' 127.0.0.1 ',' user ':' ... ',' database ':' ... '} <3,2>.
ТакжеИногда разные клиенты сервера видят разные версии данных - например, если они имели разные соединения с собственными незафиксированными данными.
Как решить проблему?
Я полагаю, что проблема с пулом- может быть, я должен закрыть / воссоздать его?На странице TorMySQL также есть эта строка: yield pool.close()