我正在使用一个简单的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
我期望成功连接到数据库。我认为我的配置可能有问题,但不知道从哪里开始解决问题。谢谢。
答案 0 :(得分:1)
此行
conn = mysql.connector.connect(host='localhost',
database='myDB',
user='xxx',
password='yyy!')
失败。因此conn
永远不会获得分配的值。但是您有一个try...except...finally
块,并且在finally
子句中,您的代码正在执行conn.close()
。但是尚未分配conn
,因为应该为它分配值的语句失败。这就是为什么您看到消息分配前引用的本地变量'conn'。要发现问题所在,请将对close
的调用移出finally
子句,然后将其放在except
之前。您以后可以随时将其移回。
答案 1 :(得分:1)
如果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)
这将干净可靠地为您关闭连接。