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
相关产品推荐
相关产品推荐

