Ошибка при подключении к базе данных MySQL с Python

0

Я использую простую функцию 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

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

Теги:
database

2 ответа

1

Если mysql.connector.connect() вызова 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

Эта линия

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню