通过SQLAlchemy插入MySQL时截断太长的varchar

时间:2015-09-02 22:58:20

标签: python mysql sqlalchemy

我通过SQLAlchemy模型将数据插入MySQL。最近,这个应用程序针对配置了STRICT_TRANS_TABLES的MySQL运行,并且应用程序偶尔会失败,因为数据对于列错误来说太长了。

我知道我可以为我的会话禁用严格 sql_mode(例如此处MySQL too long varchar truncation/error setting),

但我很好奇SQLAlchemy是否可以为列数据强制执行max String()长度。文档说,String()长度仅适用于CREATE TABLE。我的问题:

  1. 是否可以在SQLAlchemy中强制执行最大长度(截断太长的字符串)?
  2. 我可以为单个列设置还是仅为所有表/数据库中的所有列设置?

1 个答案:

答案 0 :(得分:7)

如果你想通过在python / sqlalchemy端自动截断它来enfoce最大长度,我认为使用Simple Validators是实现这一目标的最简单方法:

class MyTable(Base):
    __tablename__ = 'my_table'

    id = Column(Integer, primary_key=True)
    code = Column(String(4))
    name = Column(String(10))

    @validates('code', 'name')
    def validate_code(self, key, value):
        max_len = getattr(self.__class__, key).prop.columns[0].type.length
        if value and len(value) > max_len:
            return value[:max_len]
        return value