Flask-SQLAlchemy布尔值传入报错:如何正确设置OnlineAvailability
问题解决:SQLAlchemy布尔字段类型转换错误
问题场景
我需要将OnlineAvailability字段默认值设为True,默认所有医生时段可用:
- 发送不含该字段的POST请求时,默认值正常生效,返回正确响应;
- 但传入
OnlineAvailability: false(JSON布尔值)进行POST/PUT操作时,SQLAlchemy抛出错误:sqlalchemy.exc.StatementError: (builtins.TypeError) Not a boolean value: 'False' [SQL: INSERT INTO "OnlineSchedules" ("OnlineTimeSlot", "OnlineAvailability") VALUES (?, ?)] [parameters: [{'OnlineTimeSlot': '18:30', 'OnlineAvailability': 'False'}]]
核心需求:通过POST/PUT请求可设置OnlineAvailability为false,且GET请求返回正确的布尔格式数据。
问题原因
reqparse.RequestParser默认不会自动将传入的JSON布尔值(或字符串形式的布尔值)转换为Python布尔类型,导致存入数据库时出现类型不匹配。
解决方法
1. 为参数指定类型与默认值
在资源文件的解析器配置中,明确OnlineAvailability的参数类型为bool,并设置对应模型的默认值,解析器会自动完成类型转换:
class OnlineScheduleInfo(Resource): parser = reqparse.RequestParser() parser.add_argument("OnlineTimeSlot", required=True) # 指定类型为bool,默认值匹配模型设置 parser.add_argument("OnlineAvailability", required=False, type=bool, default=True)
2. 优化模型构造函数(可选)
为模型的构造函数参数设置默认值,避免因未传入值导致的初始化问题:
class OnlineScheduleModel(db.Model): # ... 其他字段定义 ... OnlineAvailability = db.Column(db.Boolean, nullable=False, default=True, server_default="true") # 给OnlineAvailability设置默认参数 def __init__(self, OnlineTimeSlot, OnlineAvailability=True): self.OnlineTimeSlot = OnlineTimeSlot self.OnlineAvailability = OnlineAvailability
3. 完善PUT请求的字段更新逻辑
在PUT方法中,仅当请求明确传入OnlineAvailability时才更新字段,避免覆盖原有值:
@cross_origin(supports_credentials=True) def put(self): data = OnlineScheduleInfo.parser.parse_args() schedule = OnlineScheduleModel.find_by_timeslot(data['OnlineTimeSlot']) if schedule is None: schedule = OnlineScheduleModel(**data) else: # 仅当字段存在且不为空时更新 if data.get('OnlineAvailability') is not None: schedule.OnlineAvailability = data["OnlineAvailability"] schedule.save_to_db() return {"message": "schedule, {} Updated!".format(data['OnlineTimeSlot'])}, 200
验证效果
- 发送不含
OnlineAvailability的POST请求,默认值true正常生效; - 传入
"OnlineAvailability": false时,会被正确解析为Python布尔值False,存入数据库无报错; - PUT请求可正常更新字段值,GET返回的JSON中
OnlineAvailability为布尔类型的false。
内容的提问来源于stack exchange,提问作者Rohit Nidimukkala
相关产品推荐
相关产品推荐

