Python Flask SQLAlchemy调用save方法无法提交更改到数据库如何解决?
排查与解决步骤
- 第一步优先修改吞异常的逻辑,当前的裸
except会捕获所有错误但不输出任何信息,是无法定位问题的核心原因,调整代码打印异常详情:
try: new_user.save_to_db() return {'message': 'New User {} added'.format(data['first_name'])} except Exception as e: # 调试阶段直接打印,生产环境写入错误日志即可 print(f"用户保存失败原因:{str(e)}") import traceback traceback.print_exc() return {'message': 'Internal sever error. Please contact the person responsible'}, 500
拿到具体报错后即可针对性处理,90%的同类无报错但写入失败问题都是异常被静默吞噬导致。
检查
ExtraMixin混合类逻辑- 确认混合类中是否存在未在User构造时赋值的非空字段,比如
created_at、updated_at这类字段如果没有设置默认值,会直接触发非空约束导致插入失败 - 确认混合类中是否存在
before_save、自定义__init__等钩子方法,是否有隐式抛出异常或者修改数据的逻辑
- 确认混合类中是否存在未在User构造时赋值的非空字段,比如
校验数据库连接与配置
- 确认
SQLALCHEMY_DATABASE_URI配置指向的数据库和你手动查询的数据库为同一个,避免出现连测试库查生产库的低级错误 - 临时开启
SQLALCHEMY_ECHO = True配置,控制台会输出所有执行的SQL语句,查看是否实际触发了INSERT操作、是否有ROLLBACK回滚操作
- 确认
排查数据库约束冲突
- 确认传入的
user_type_id在user_type表中存在对应记录,外键约束失败会直接触发回滚 - 如果传入的
vendor_id非空,确认该ID在vendor表中存在对应记录 - 确认传入的
phone_number、email未在数据库中存在,唯一键冲突会导致插入失败 - 确认
User.generate_hash生成的密码长度不超过password字段设置的200字符上限
- 确认传入的
排查事务逻辑问题
- 检查全局是否有中间件、请求钩子在接口返回后触发了事务回滚
- 可在
save_to_db的db.session.commit()后打印self.id,如果能正常输出生成的主键ID,说明插入成功,问题出在你的查询操作(比如查询条件错误、连错库);如果没有ID输出,说明插入动作确实未执行。
内容的提问来源于stack exchange,提问作者Kally
相关产品推荐
相关产品推荐

