Sqlalchemy 正在更新已创建的对象

Sqlalchemy 正在更新已创建的对象,sqlalchemy,Sqlalchemy,我在sqlalchemy中有一个继承方案(这是一个示例代码,我想逻辑很清楚): 在这段代码之后,我有了一个包含所有需要的列和基类字段的表。子类字段(“区域”)为空。 有办法解决吗?你的逻辑有点不清楚。如果您总是在generate中显式地创建Base实例,这是值得怀疑的。这就引出了一个问题“你想完成什么”并且需要一个。你也在传递cls以在子级中生成,尽管使用super,这会引起一个错误。问题是,我不想在每个子级中复制generate的“基类”部分。所以我先创建一个基,然后在子类中填充所需的日期。什

我在sqlalchemy中有一个继承方案(这是一个示例代码,我想逻辑很清楚):

在这段代码之后,我有了一个包含所有需要的列和基类字段的表。子类字段(“区域”)为空。
有办法解决吗?

你的逻辑有点不清楚。如果您总是在generate中显式地创建Base实例,这是值得怀疑的。这就引出了一个问题“你想完成什么”并且需要一个。你也在传递cls以在子级中生成,尽管使用super,这会引起一个错误。问题是,我不想在每个子级中复制generate的“基类”部分。所以我先创建一个基,然后在子类中填充所需的日期。什么不清楚?有什么模式可以让它更清楚吗?对于初学者来说,这不是继承的工作方式。您不需要先创建Base实例,然后在Child的generate中以您所做的方式初始化并升级到Child。考虑在工厂方法中使用传递的CLS参数。如前所述,调用super的generate in child的方式应该会产生错误。您的编辑清楚地表明,您的问题源于如何在factory方法中显式使用Base而不是cls参数。您设置了Base实例的属性区域,而不是Child实例的属性区域。最好不要将实例添加到Base.generate中的DB中。是否从Child.generate提交其他更改?让generate工厂简单地返回生成的实例,调用方处理持久性。总而言之,你读过这本书了吗?或者说,这本书是写给你的吗?
class Base:
    @classmethod
    def generate(cls, somedata):
        base = Base(...)
        # populating Base class fields here
        ...
        session.add(base)
        session.flush()
        return base

class Child(Base):
    @declared_attr
    def area(self):
        return Base.__table__.c.get('field', Column(Float))
    @classmethod
    def generate(cls):
        base = super(Child, cls).generate(cls, somedata)
        # not sure if I need this or not. It doesn't matter it seems
        # base.__class__ = cls 
        base.area = 10.5