Flask应用插入MySQL数据报1064 SQL语法错误该如何解决?
问题根因
1064语法错误的核心原因是condition属于MySQL保留字,你直接将其作为列名放在INSERT的()符号内的字段列表中,SQL执行时会将其识别为关键字而非列名,因此在condition附近抛出语法错误。
第一种写法本身也存在逻辑问题:直接把Python变量名写在SQL字符串中,执行时会将new_info['make']这类内容直接作为SQL的一部分,而不会解析为对应变量的内容,即使没有保留字的问题也会执行失败,这种写法还存在SQL注入风险,完全不推荐使用。
解决方法
将SQL中属于保留字的列用反引号()包裹即可,year同样是MySQL的year`保留字,建议一同包裹,修正后的参数化写法如下:
sql_cursor = mysql.connection.cursor() # 为保留字列名添加反引号 sql_cursor("INSERT INTO user_data (make,model,trim,fuel_type,`condition`,transmission,body_type,region,descriptn,eng_capacity,`year`, mileage, estm_value) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)", ( new_info['make'], (new_info['model'], new_info['trim'], new_info['fuel_type'], new_info['transmission'], new_info['condition'], add_bodytype['body_type'], add_region['region'], new_data['description'], new_data['eng_capacity'], year, new_data[''], new_data['mileage'], estm_value ) ) mysql.connection.commit()
额外建议
- 后续建表时尽量避免使用MySQL保留字作为列名,如果已经建好表无法修改字段名,每次在SQL中使用该列时都需要用反引号包裹。
- 坚持使用参数化查询的写法,不要直接拼接变量到SQL中,可有效避免SQL注入,也不用处理特殊字符转义的问题。
内容的提问来源于stack exchange,提问作者Elijah Kalii
相关产品推荐
相关产品推荐

