query.filter无法返回完整对象

时间:2016-05-16 15:51:08

标签: python sqlalchemy

我有下面的一小段代码来创建对象曲线。创建新曲线后,它首先运行方法__new__。它检查此曲线是否已存在于数据库中,如果存在,则返回此曲线。

在空数据库上创建新曲线时,它会按预期返回None。如果它是在name已经存在的情况下创建的,那么它会抛出一个错误并指出KeyError: 'name'(这里不是很多信息......)。

class Curve(Base):

    __tablename__ = 'curve'
    id = Column(Integer, primary_key = True)
    name = Column(String, unique = True)
    type = Column(String)

    # We override the new method to first check if the object already exists
    # If it does exist then we return this object
    def __new__(*cls, **kw):
        x = base.session.query(Curve).filter(Curve.name==kw["name"]).first()
        if x: return x
        return object.__new__(*cls, **kw)

    def __init__(self, type, name):
        self.type = type
        self.name = name
        self.add(False)

    def add(self, commit):
        create(base.session, self, commit, name=self.name)

有趣的是,如果不返回整个曲线,我们只返回一个属性,例如

x = base.session.query(Curve.name).filter(Curve.name==kw["name"]).first()

然后它运作得很好......

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您可以尝试将 __ new __ 方法更新为此。

def __new__(cls, **kw):
    x = base.session.query(Curve).filter(Curve.name==kw["name"]).first()
    if x: return x
    return super(Curve, cls).__new__(**kw)