问题描述
我正在尝试从 Python 连接到现有的 MysqL 数据库并创建一个表。以下是代码:
from getpass import getpass
from MysqL.connector import connect,Error
def connect_db():
try:
with connect(
host="localhost",user=input("Enter username: "),password=getpass("Enter password: "),database="online_movie_rating",) as connection :
return connection
except Error as e:
print(e)
create_ratings_table_query = """
CREATE TABLE ratings (
movie_id INT,reviewer_id INT,rating DECIMAL(2,1),FOREIGN KEY(movie_id) REFERENCES movies(id),FOREIGN KEY(reviewer_id) REFERENCES reviewers(id),PRIMARY KEY(movie_id,reviewer_id)
);
"""
cnx = connect_db()
print(cnx)
cursor = cnx.cursor()
cursor.execute(create_ratings_table_query)
cnx.commit()
当我评论最后 3 行时,我可以打印连接对象。但是,当我取消注释并尝试运行时,出现以下错误:
cursor = cnx.cursor()
MysqL.connector.errors.OperationalError: MysqL Connection not available.
我在 conda 环境中使用 Fedora 33 操作系统、Python 3.8.5,并使用 VS Code 作为 IDE。已经pip安装了mysql-connector-python。
有人可以帮忙吗?已经做了很多谷歌搜索,但找不到明确的答案。
提前致谢
解决方法
你有:
def connect_db():
try:
with connect(
host="localhost",user=input("Enter username: "),password=getpass("Enter password: "),database="online_movie_rating",) as connection :
return connection
except Error as e:
print(e)
但是一旦您的 return connection
执行,with connect(...) as connection:
块就会终止并关闭连接。因此,如果连接成功,您将返回一个关闭的连接。你需要:
def connect_db():
try:
connection = connect(
host="localhost",)
return connection
except Error as e:
print(e)
调用者可以使用 cnx.close()
明确地关闭连接,或者当没有更多对此连接的引用时,它会自动关闭,例如当 cnx
超出范围时。
另外,如果连接出错,函数connect_db
会返回None
。因此,也许呼叫者应该检查这种可能性。
然而,您得到的实际异常解释如下:
此异常是针对与 MySQL 操作相关的错误引发的。例如:连接太多;无法解析主机名;握手不好;服务器正在关闭,通信错误。
您需要检查您的连接参数。但很明显,您必须进行上述源代码更改。