如何在SSQLAlchemy composite()上处理NULL值

时间:2017-02-15 13:10:12

标签: python sqlalchemy

我有以下ORM结构:

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 Noneparam is None

1 个答案:

答案 0 :(得分:0)

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

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的实例或None。

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

哈努哈利