You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python使用mysql-connector连接MySQL创建表时出现‘MySQL Connection not available’错误求助

解决MySQL Connection not available错误的问题

这个错误的根源很明确:你在connect_db函数里使用了with语句创建数据库连接,而with块执行完毕后,连接会被自动关闭。所以当你从函数返回connection时,它已经是一个关闭的连接对象了,自然无法调用cursor()方法。

为什么会这样?

mysql.connector.connect()返回的连接对象实现了上下文管理器协议,with语句会在代码块执行完成(或者抛出异常)后自动调用连接的close()方法,确保资源被正确释放。但这也意味着,with块之外的代码无法再使用这个连接。

解决方案一:手动管理连接生命周期

去掉with语句,直接返回创建好的连接,在使用完毕后手动关闭它:

from getpass import getpass
from mysql.connector import connect, Error

def connect_db():
    try:
        # 直接创建连接,不使用with语句
        connection = connect(
            host="localhost",
            user=input("Enter username: "),
            password=getpass("Enter password: "),
            database="online_movie_rating",
        )
        return connection
    except Error as e:
        print(e)
        return None

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()
if cnx:
    try:
        cursor = cnx.cursor()
        cursor.execute(create_ratings_table_query)
        cnx.commit()
        print("Ratings table created successfully!")
    except Error as e:
        print(f"Error creating table: {e}")
    finally:
        # 手动关闭连接,避免资源泄漏
        cnx.close()

解决方案二:在with块内完成所有数据库操作

既然with会自动管理连接,那可以把创建表的逻辑也放到with块内部,这样就不需要返回连接对象了:

from getpass import getpass
from mysql.connector import connect, Error

def create_ratings_table():
    try:
        with connect(
            host="localhost",
            user=input("Enter username: "),
            password=getpass("Enter password: "),
            database="online_movie_rating",
        ) as connection :
            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)
            );
            """
            cursor = connection.cursor()
            cursor.execute(create_ratings_table_query)
            connection.commit()
            print("Ratings table created successfully!")
    except Error as e:
        print(f"Error creating table: {e}")

# 直接调用函数完成操作
create_ratings_table()

额外提醒

  • 确保movies和reviewers表已经存在,否则外键约束会导致创建ratings表失败。
  • 处理数据库操作时,尽量用try-except捕获可能的异常,避免程序直接崩溃。

内容的提问来源于stack exchange,提问作者Sachin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 04:32:35