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

在Flask Admin中使用form_choices时出现TypeError: can't escape str to binary错误

问题原因与解决方法

报错TypeError: can't escape str to binary的核心原因是SQLAlchemy尝试将字符串值存入二进制类型的数据库列,导致类型转换失败。以下是具体排查和修复步骤:

1. 检查数据库表结构

确认warehouses表的timezone列类型为字符串类型(如MySQL的VARCHAR、PostgreSQL的TEXT/VARCHAR),而非二进制类型(如BLOB、VARBINARY)。如果列类型错误,需要执行SQL语句修改表结构,例如MySQL:

ALTER TABLE warehouses MODIFY COLUMN timezone VARCHAR(255);

2. 修正模型列定义

在模型中明确指定字符串列的长度和类型,避免隐式类型匹配问题:

class Warehouse(BaseModel):
    __tablename__ = 'warehouses'
    id = db.Column(db.Integer, primary_key=True)
    display_name = db.Column(db.String(255))
    timezone = db.Column(db.String(255))  # 明确指定长度,或用db.Unicode(255)支持多语言

3. 调整时区选项生成逻辑

改用有序的pytz.all_timezones列表(集合是无序的,下拉菜单体验差),确保返回的选项均为字符串类型:

def timezones():
    # 排序后生成选项,提升用户选择体验
    return [(tz, tz) for tz in sorted(pytz.all_timezones)]

class WarehouseView(ModelView):
    form_choices = {
        "timezone": timezones()
    }

4. 排查自定义表单逻辑

确认没有自定义的表单处理代码将选中的时区名称转换成了pytz.timezone()实例,这类对象无法直接存入字符串列,需确保提交给模型的是纯字符串格式的时区名称。

内容的提问来源于stack exchange,提问作者Omar Abdelrazik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 18:36:41