Python无法写入MySQL:输入报错及SQL语句拼接异常求助
问题分析与解决方案
核心问题原因
- 字符串拼接语法错误:拼接SQL语句时使用了中文引号(“”、‘’),Python无法识别这种引号来解析变量,导致
values['pay_to']等变量被直接当作字符串内容写入SQL,数据库执行时触发语法异常。 - 字段顺序不匹配:INSERT定义的字段顺序是
pay_to, amount_words, amount,...,但VALUES里的参数顺序是pay_to, amount, amount_words,...,顺序完全混乱,即使拼接正确也会导致数据插入错位。 - 非空校验逻辑失效:当前的非空判断仅弹出错误但不终止函数,比如
pay_to为空时,错误弹窗后代码仍会执行插入逻辑;且else块仅绑定最后一个company的判断,只要company不为空,其他字段为空也会尝试插入。 - 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
相关产品推荐
相关产品推荐

