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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:45:49