【问题标题】:How can sqlalchemy work with custom class as the attributessqlalchemy 如何使用自定义类作为属性
【发布时间】:2017-03-08 12:52:26
【问题描述】:

我正在使用 sqlalchemy 和 flask-sqlalchemy,我的一个 db 模型带有一个状态列

class Item(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(8))
    state = db.Column(db.Integer, default=ServerState.IN_PACKAGE, nullable=True)

    def init_state(self):

        self.state = State1

    def transit_state(self):

        self.state.next(self) 

问题是这个状态列作为整数保存到db中,但是为了实现合适的状态机,它被实现为一个类:

class State1(BaseState):

    __int = 100
    __name = 'State1'

    @staticmethod
    def next(item):
        if item.contidition1 is None or item.condition2 is None:
            raise InvalidStateTransition

        item.state = State2

这很好用并且保持代码干净,但关键问题是当我想将项目提交到数据库时,它肯定会给我错误:

 Incorrect integer value: '<class 'app.models.Item.State1'>' for column 'state' at row 1

那么,有没有办法让 session 或 python 在保存到 db 时自动将类转换为其 int 表示,并在从 db 中检索时从 int 转换为其状态类?

【问题讨论】:

    标签: python sqlalchemy flask-sqlalchemy


    【解决方案1】:

    您可以使用TypeDecorator。比如:

    class StateType(TypeDecorator):
        impl = Integer
    
        def process_bind_param(self, value, dialect):
            return map_integer_to_my_state(value)
    
        def process_result_value(self, value, dialect):
            return map_my_state_to_integer(value)
    

    那么你可以使用StateType作为state列的类型:

    state = db.Column(StateType, ...)
    

    【讨论】:

      猜你喜欢
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 2011-01-14
      • 2013-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多