#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)
Это аккуратно и надежно позаботится о закрытии вашего соединения для вас.