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

#python #mysql #linux #database #ubuntu

#python #mysql #linux #База данных #ubuntu

Вопрос:

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

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

Ответ №1:

Эта строка

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

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

Ответ №2:

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

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

 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)
  

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