Python, Торнадо, TorMySQL - PullRequest
       8

Python, Торнадо, TorMySQL

0 голосов
/ 17 ноября 2018

У меня есть старый, большой проект, основанный на 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()

1 Ответ

0 голосов
/ 24 ноября 2018

Возможно, вам придется использовать conn.commit () даже после запроса SELECT - в противном случае выполнение запросов SELECT выполняется в той же транзакции, что и первая.

Я думаю, что большинство пользователей привыкли к "автокоммиту"по умолчанию, но это не похоже на режим по умолчанию для TorMySQL

(я был смущен так же, как и вы, в первые пару дней использования TorMySQL:)

...