Похоже, что mysql.connector.connect не имеет постоянного соединения через функции - PullRequest
0 голосов
/ 25 сентября 2018

У меня небольшая проблема при использовании mysql в python с фреймворком Flask.Я настроил функцию (get_db()) для подключения к базе данных после запроса и обслуживания того же подключения к функциям, запрашивающим его позже (в рамках того же запроса).

import mysql.connector #mysql-connector-python==8.0.12

def get_db():
if 'db' not in g:
    try:
        click.echo("Trying to connect")
        cnx = mysql.connector.connect(user='stack', password='overflow',
                          host='127.0.0.1',
                          database=DB_NAME)
        g.db = cnx
        return g.db
    except mysql.connector.Error as err:
        if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
            click.echo("Connection failed! Check username and password")
        elif err.errno == errorcode.ER_BAD_DB_ERROR:
            click.echo("Database does not exist")
        else:
            click.echo("Unknown error: {} ".format(err))
    else:
        cnx.close()
    # Connection to db cannot
    # be established.
    # click.echo("Will exit from database")
    exit(1)

click.echo("Using existing connection")
return g.db

В других функциях Iиспользуйте это так:

(...)
cnx = get_db()
cursor = cnx.cursor()
(...)

Первая функция, которая использует базу данных, работает нормально.Затем, когда другой пытается подключиться к ошибкам cursor, поскольку cnx не имеет подключения:

raise errors.OperationalError("MySQL Connection not available.")

У кого-нибудь есть способ справиться с этим?

Одно из решений состоит в том, чтобы заново создать соединение для каждой функции, но для повышения производительности я предпочитаю повторно использовать соединение, если это возможно.

1 Ответ

0 голосов
/ 26 сентября 2018

Решение, с которым я в настоящее время столкнулся, включает reconnect каждый раз, когда методу требуется соединение с БД.

Я не знаю, получит ли это служебную нагрузку при получении connect(), но этоподходит для текущего варианта использования.

Код будет выглядеть так:

def get_db():
if 'db' not in g:
    try:
        cnx = mysql.connector.connect(user='tom', password='jerry',
                          host='127.0.0.1',
                          database=DB_NAME)
        g.db = cnx
        click.echo("Returns new connection")
        return g.db
    except mysql.connector.Error as err:
        if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
            click.echo("Connection failed! Check username and password")
        elif err.errno == errorcode.ER_BAD_DB_ERROR:
            click.echo("Database does not exist")
        else:
            click.echo("Unknown error: {} ".format(err))

cnx = g.db
cnx.reconnect() <--- Doing a reconnect each time
return cnx
...