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

Python无法写入MySQL:输入报错及SQL语句拼接异常求助

问题分析与解决方案

核心问题原因

  1. 字符串拼接语法错误:拼接SQL语句时使用了中文引号(“”、‘’),Python无法识别这种引号来解析变量,导致values['pay_to']等变量被直接当作字符串内容写入SQL,数据库执行时触发语法异常。
  2. 字段顺序不匹配:INSERT定义的字段顺序是pay_to, amount_words, amount,...,但VALUES里的参数顺序是pay_to, amount, amount_words,...,顺序完全混乱,即使拼接正确也会导致数据插入错位。
  3. 非空校验逻辑失效:当前的非空判断仅弹出错误但不终止函数,比如pay_to为空时,错误弹窗后代码仍会执行插入逻辑;且else块仅绑定最后一个company的判断,只要company不为空,其他字段为空也会尝试插入。
  4. SQL注入风险与特殊字符问题:直接拼接用户输入到SQL中,若输入包含单引号等特殊字符会破坏SQL语法,同时存在SQL注入攻击风险。

修正后的代码

def submit_records():
    # 批量校验必填字段,任一为空则终止流程
    required_fields = [
        ('pay_to', 'Missing Pay_to'),
        ('amount_words', 'Missing amount in words'),
        ('amount', 'Missing amount'),
        ('address', 'Missing address'),
        ('purpose', 'Missing purpose'),
        ('drawer', 'Missing drawer'),
        ('issue_date', 'Missing issue_date'),
        ('company', 'Missing company')
    ]
    for field_name, error_msg in required_fields:
        # 去除首尾空格后判断是否为空
        if not values.get(field_name, '').strip():
            sg.popup_error(error_msg)
            return  # 终止函数,不再执行后续插入逻辑

    try:
        # 使用参数化查询,彻底避免拼接错误和SQL注入
        sql_command = """
            INSERT INTO db_class.box(
                pay_to, amount_words, amount, address, 
                purpose, drawer, issue_date, company
            ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)
        """
        # 严格按照字段顺序传入参数
        params = (
            values['pay_to'].strip(),
            values['amount_words'].strip(),
            values['amount'].strip(),
            values['address'].strip(),
            values['purpose'].strip(),
            values['drawer'].strip(),
            values['issue_date'].strip(),
            values['company'].strip()
        )
        # 打印调试信息(可选)
        print(f"执行SQL语句: {sql_command.strip()}")
        print(f"传入参数: {params}")
        
        myCursor.execute(sql_command, params)
        dbms.commit()
        
        choice = sg.popup_ok_cancel("Please confirm entry")
        if choice == 'OK':
            clear_records()
            sg.popup_quick('records entered')
        else:
            sg.popup_ok('Edit Entry')
    except Exception as e:
        # 捕获并显示具体异常,方便排查问题
        sg.popup(f'错误详情: {str(e)}')
        print(f"异常日志: {str(e)}")

关键修正点说明

  • 替换中文引号为英文引号:确保Python能正确解析变量(改用参数化查询后直接避免了拼接问题)。
  • 对齐字段与参数顺序:保证插入的数据对应正确的数据库字段。
  • 优化非空校验逻辑:任一必填字段为空时立即终止函数,避免无效的数据库操作。
  • 参数化查询:将用户输入作为独立参数传入,既解决了特殊字符导致的语法错误,也杜绝了SQL注入风险,代码更易维护。
  • 捕获具体异常:替换原有的空except,打印具体错误信息,快速定位问题根源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:25:25