SQLAlchemy——我可以在 DDL 中将空字符串映射到 null 吗?我想要一个可为空的整数列在插入或更新时将 '' 转换为 NULL

mso*_*uth 5 python sqlalchemy wtforms

我有一个 SQLAlchemy 模型,其中有一个从 HTML 表单填充的整数列(我正在使用 Flask 和 WTForms-alchemy,并且我试图避免在路由中编写自定义代码)。如果用户没有在表单上输入该整数的值,则从表单填充对象的代码最终会尝试为该列放入一个空字符串,并且 MySQL 会抱怨这不是一个整数值。为了帮助人们搜索:我开始遇到的错误Incorrect integer value: '' for column ...

我不想使用sql_mode=''hack,人们建议这样做是为了让 MySQL 回到旧的行为,每当你给它不正确的数据时就进行猜测,因为我无法控制最终将使用的 MySQL 服务器。

我想要的是类似于默认列规范的东西,除了在没有任何内容传入时指定默认值,我想拦截尝试放入空字符串并将其替换为 None ,我认为这会被转换为当它进入数据库时​​为 null。

有没有办法在模型定义中做到这一点?我意识到这可能会导致性能下降,但吞吐量在此应用程序中并不是什么大问题。

mso*_*uth 6

我找到了一个方法。装饰validates器可以在传入的过程中更改值。我是这样做的:

from sqlalchemy.orm import validates

class Task(Base):
    __tablename__ = 'task'

    id = Column(INTEGER(11), primary_key=True)

    time_per_unit = Column(INTEGER(11))


    @validates('time_per_unit')
    def empty_string_to_null(self, key, value):
        if isinstance(value,str) and value == '':
            return None
        else:
            return value
Run Code Online (Sandbox Code Playgroud)

  • 我认为没有理由检查 `isinstance(value, str)` 你可以只是 `value == ''` 并且如果 value 是非字符串类型它仍然是 `False` (3认同)