Ошибка при подключении к базе данных MySQL с Python - PullRequest
0 голосов
/ 11 апреля 2019

Я использую простую функцию python для подключения к базе данных MySQL. Я получаю сообщение о том, что на переменную ссылаются до того, как она назначена, но это не будет иметь место, если соединение успешно установлено. Почему происходит сбой соединения?

Я использую Ubuntu Linux 18.04. Я использую xampp 7.3 для размещения серверов mySQL и apache и использую phpmyadmin для доступа к базе данных. Я выполняю свой код на python 3.

Это мой код:

import mysql.connector
from mysql.connector import Error

def connect():
    """ Connect to MySQL database """

    try:
        conn = mysql.connector.connect(host='localhost',
                               database='myDB',
                               user='xxx',
                               password='yyy!')

        if conn.is_connected():
            print('Connected to MySQL database')

    except Error as e:
        print(e)

    finally:
        conn.close()

if __name__ == '__main__':
connect()

И это ошибка, которую я получаю:

Traceback (most recent call last):
  File "01_python-mysql-connect.py", line 23, in <module>
     connect()
  File "01_python-mysql-connect.py", line 19, in connect
     conn.close()
UnboundLocalError: local variable 'conn' referenced before assignment

Я ожидаю успешного подключения к базе данных. Я считаю, что что-то может быть не так с моими конфигурациями, но не знаю, с чего начать в решении проблемы. Спасибо.

Ответы [ 2 ]

1 голос
/ 13 апреля 2019

Если вызов mysql.connector.connect() завершится неудачно, conn не будет назначен, следовательно, исключение «ссылка перед назначением».

Это идеальный вариант использования менеджера контекста contextlib.closing , я думаю. Попробуйте что-то вроде этого:

from contextlib import closing

try:
    with closing(mysql.connector.connect(...)) as conn:
        if conn.is_connected():
            print('Connected to MySQL database')

except Error as e:
    print(e)

Это чисто и надежно позаботится о закрытии вашего соединения для вас.

1 голос
/ 11 апреля 2019

Эта строка

conn = mysql.connector.connect(host='localhost',
                           database='myDB',
                           user='xxx',
                           password='yyy!')

не работает.Таким образом, conn никогда не получает присвоенное ему значение.Но у вас есть блок try...except...finally и в предложении finally ваш код делает conn.close().Но conn не был назначен, потому что оператор, который должен был присвоить ему значение, не удался.Вот почему вы видите сообщение локальная переменная 'conn', на которую ссылается перед присваиванием .Чтобы выяснить, что не так, переместите вызов на close из предложения finally и поставьте его перед except.Вы всегда можете переместить его позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...