.cursor() 使 MySQL 不可用

问题描述

我正在尝试从 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 操作相关的错误引发的。例如:连接太多;无法解析主机名;握手不好;服务器正在关闭,通信错误。

您需要检查您的连接参数。但很明显,您必须进行上述源代码更改。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...