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

MySQL插入数据失败及建表异常求助:cursor.description返回None

问题分析与解决方案

首先先澄清一个点:你执行print(cursor.description)得到None是完全正常的——DROP TABLE、CREATE TABLE这类DDL(数据定义语言)语句不会返回任何结果集,只有SELECT、SHOW这类查询类语句执行后,cursor.description才会返回结果集的元数据(比如列名、类型等)。这个不是错误,不用纠结~

接下来针对你创建表时的未知错误,我整理了几个常见排查方向和解决方法:

1. 补全并修复SQL语法错误

你提供的代码里varchar(2...明显是截断了,语法不完整会直接导致创建表失败。比如你可能想写varchar(255)(可根据实际需求调整长度)。另外,MySQL中如果表名包含特殊字符或者是关键字,必须用反引号``包裹,否则会报错。推荐用f-string拼接语句并加上反引号:

create_table = f"""
CREATE TABLE `{city}` (
    id int(10) NOT NULL PRIMARY KEY AUTO_INCREMENT,
    total_price int(10),
    unitPrice int(10),
    room_desc varchar(255)  -- 补全长度,比如255
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
"""

2. 确认已切换到目标数据库db_of_lj

检查你的数据库连接是否指定了目标数据库,或者在执行建表语句前先切换到该库:

  • 连接时直接指定:
conn = pymysql.connect(
    host='localhost',
    user='你的用户名',
    password='你的密码',
    db='db_of_lj',  # 这里指定要操作的数据库
    charset='utf8mb4'
)
  • 如果连接时没指定,先执行切换语句:
cursor.execute("USE db_of_lj;")

3. 检查数据库用户权限

如果你的连接用户没有db_of_lj库的CREATE、DROP权限,也会导致建表失败。可以用以下SQL查询当前用户权限:

SHOW GRANTS FOR '你的用户名'@'localhost';

如果权限不足,用root用户给该用户授权:

GRANT CREATE, DROP ON db_of_lj.* TO '你的用户名'@'localhost';
FLUSH PRIVILEGES;

4. 捕获具体错误信息,精准定位问题

现在你只知道有未知错误,建议在代码里添加异常捕获,打印具体错误内容——这是排查SQL问题最有效的方式:

import pymysql
from pymysql import ProgrammingError, OperationalError

def create_city_table(city):
    global cursor, conn
    try:
        # 安全删除表(带反引号)
        cursor.execute(f"DROP TABLE IF EXISTS `{city}`;")
        # 完整建表语句
        create_table = f"""
        CREATE TABLE `{city}` (
            id int(10) NOT NULL PRIMARY KEY AUTO_INCREMENT,
            total_price int(10),
            unitPrice int(10),
            room_desc varchar(255)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
        """
        cursor.execute(create_table)
        conn.commit()  # 显式提交更稳妥,部分环境下DDL需要手动提交
        print(f"表 {city} 创建成功!")
    except ProgrammingError as e:
        print(f"SQL语法错误:{str(e)}")
    except OperationalError as e:
        print(f"连接/权限错误:{str(e)}")
    except Exception as e:
        print(f"其他未知错误:{str(e)}")

# 初始化连接和游标
conn = pymysql.connect(
    host='localhost',
    user='你的用户名',
    password='你的密码',
    db='db_of_lj',
    charset='utf8mb4'
)
cursor = conn.cursor()

# 测试调用
create_city_table("test_city")

# 记得关闭资源
cursor.close()
conn.close()

5. 注意SQL注入风险

如果city变量来自用户输入,直接拼接表名会有SQL注入风险。可以用pymysql的escape_string方法先转义表名:

safe_city = conn.escape_string(city)
cursor.execute(f"DROP TABLE IF EXISTS `{safe_city}`;")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:37:48