2017-02-15 59 views
0

我有以下ORM结构:如何在SSQLAlchemy复合()处理NULL值

class ParamWrapper: 
    def __init__(self, param): 
     self.param = param 
    def __composite_values__(self): 
     return self.param 


class Game(Base): 
    __tablename__ = 'game' 
    game_id = Column(Integer, primary_key=True) 
    raw_param = Column(UnicodeText, unique=True) 
    param = composite(ParamWrapper, raw_param) 

我怎样才能让这个如果raw_param is None,然后还param is None

+0

这是什么现在这个设置? – Hannu

+0

目前它是'param = ParamWrapper(None)' – Jari

+0

我不认为你可以用复合类来做,因为param总是ParamWrapper的一个实例。你可以用混合属性来做到这一点。请参阅下面的答案。 – Hannu

回答

0

我会用hybrid_property来解决这个问题,因为你需要一个条件。 Composite总是返回复合类。如果返回值需要为None而不是ParamWrapper(无),唯一的方法就是在某处分支。

from sqlalchemy.ext.hybrid import hybrid_property 
... 
class ParamWrapper: 
    def __init__(self, param): 
     self.param = param 
    def __composite_values__(self): 
     return self.param 


class Game(Base): 
    __tablename__ = 'game' 
    game_id = Column(Integer, primary_key=True) 
    raw_param = Column(UnicodeText, unique=True) 
    param_raw = composite(ParamWrapper, raw_param) 

    @hybrid_property 
    def param(self): 
     return self.param_raw if self.raw_param is not None else None 

这使得您的Game.param或者是ParamWrapper的一个实例,或者是无。

这样做的用处可以辩论,你需要访问foo.param.param获得从查询结果对象的实际值。如果foo.param是None,则会失败并出现异常。如果你只对对象的内容感兴趣而不是对象本身,你当然可以修改hybrid属性来返回self.param_raw.param。那么你会有这个或无,但从来没有例外。

Hannu