我正在使用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
这很好用并保持代码干净,但关键问题是当我想将Item提交到db时,肯定会给我错误:
Incorrect integer value: '<class 'app.models.Item.State1'>' for column 'state' at row 1
那么,会话或python是否有一种方法可以在保存到db时自动将类转换为其int表示形式,并在从db中检索时从int转换为其状态类?
答案 0 :(得分:2)
您可以使用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, ...)