求助:使用Python创建MySQL数据库及数据表失败,求排查问题
问题排查与修复方案
让我帮你梳理下代码里可能存在的几个问题,以及对应的修复方式:
1. 目标数据库可能尚未创建
你在连接时直接指定了database = bk.dbName,但如果这个数据库还不存在,mysql.connector会直接抛出连接失败的错误,更别说创建数据表了。
修复方式:
要么提前手动创建好这个数据库,要么在代码里先检查并创建数据库(如果不存在的话):
# 先不指定database进行连接 conn = mysql.connector.connect( host = bk.dbHost, user = bk.dbUser, password = bk.dbPass ) mycursor = conn.cursor() # 创建数据库(如果不存在) mycursor.execute(f"CREATE DATABASE IF NOT EXISTS {bk.dbName}") # 切换到目标数据库 conn.database = bk.dbName
2. 多语句执行时未迭代处理结果
使用multi=True执行多条SQL语句时,mysql.connector返回的是一个迭代器,你需要遍历这个迭代器才能确保所有语句都被执行。如果只是调用mycursor.execute(sql_fs1, multi=True)而不处理返回结果,部分语句可能不会被正确执行。
修复方式:
遍历execute的返回结果:
for result in mycursor.execute(sql_fs1, multi=True): # 可以在这里打印语句执行状态,方便调试 if result.with_rows: print(f"语句执行结果: {result.fetchall()}")
3. 缺少错误捕获机制
你的代码没有任何错误处理逻辑,就算执行过程中抛出了语法错误、权限错误等异常,你也看不到具体的报错信息,自然不知道问题出在哪。
修复方式:
添加try-except块捕获并打印错误:
def create_table(): try: sql_fs1 = ("SET SQL_MODE = 'NO_AUTO_VALUE_ON_ZERO';" "SET AUTOCOMMIT = 0;START TRANSACTION;" "SET time_zone = '+00:00';" "CREATE TABLE IF NOT EXISTS `test_table`(`id` int(10) NOT NULL PRIMARY KEY " "AUTO_INCREMENT,`date_added` timestamp NOT NULL DEFAULT " "CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,`test_info` " "varchar(10) NOT NULL,`xxx` varchar(255) NOT NULL);") # 遍历执行所有语句 for result in mycursor.execute(sql_fs1, multi=True): pass conn.commit() print("数据表创建成功!") except mysql.connector.Error as err: print(f"执行出错: {err}") conn.rollback()
另外,建议在CREATE TABLE语句里加上IF NOT EXISTS,避免重复创建时抛出错误。
4. 权限问题(潜在风险)
确保你使用的数据库用户bk.dbUser拥有创建数据表的权限,如果权限不足,也会导致创建失败。可以手动登录数据库执行GRANT CREATE ON {bk.dbName}.* TO '{bk.dbUser}'@'{bk.dbHost}';来赋予权限。
完整修复后的代码示例
import mysql.connector import bot_keys as bk def create_table(): conn = None mycursor = None try: # 先连接数据库服务,不指定具体数据库 conn = mysql.connector.connect( host = bk.dbHost, user = bk.dbUser, password = bk.dbPass ) mycursor = conn.cursor() # 创建目标数据库(如果不存在) mycursor.execute(f"CREATE DATABASE IF NOT EXISTS {bk.dbName}") conn.database = bk.dbName sql_fs1 = ("SET SQL_MODE = 'NO_AUTO_VALUE_ON_ZERO';" "SET AUTOCOMMIT = 0;START TRANSACTION;" "SET time_zone = '+00:00';" "CREATE TABLE IF NOT EXISTS `test_table`(`id` int(10) NOT NULL PRIMARY KEY " "AUTO_INCREMENT,`date_added` timestamp NOT NULL DEFAULT " "CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,`test_info` " "varchar(10) NOT NULL,`xxx` varchar(255) NOT NULL);") # 执行所有SQL语句 for result in mycursor.execute(sql_fs1, multi=True): # 可选:打印每条语句的执行状态 if result.statement: print(f"执行语句: {result.statement}") conn.commit() print("数据表创建成功!") except mysql.connector.Error as err: print(f"错误信息: {err}") if conn: conn.rollback() finally: # 关闭游标和连接 if mycursor: mycursor.close() if conn: conn.close() create_table()
内容的提问来源于stack exchange,提问作者Dominic Ormston
相关产品推荐
相关产品推荐

