SQLAlchemy - 同一个表中的父子关系

时间:2012-10-16 07:17:55

标签: python mysql python-3.x sqlalchemy

我希望在同一个表中拥有父子关系。以下是我所拥有的,它不起作用。通过“不工作”,我的意思是当我在某个.children对象上调用Item时,它会给我[]。我的代码中的错误是什么以及如何正确执行?感谢。

parents_children = Table('parents_children', Base.metadata,
                         Column('parent_id', bigint, ForeignKey('items.id', name='a'), primary_key=True),
                         Column('child_id', bigint, ForeignKey('items.id', name='b'), primary_key=True)
                         )

class Item(Base):
    __tablename__ = 'items'
    id = Column(bigint, primary_key=True, autoincrement=True)
    name = Column(types.String(80), default="")
    display_name = Column(types.String(80), default="")
    version = Column(types.String(80), default="")
    discriminator = Column(item_tag_enum, nullable=False)
    children = relationship('Item',
                            secondary=parents_children,
                            primaryjoin=id == parents_children.c.parent_id,
                            secondaryjoin=id == parents_children.c.child_id,
                            backref='parents')
    __mapper_args__ = {'polymorphic_on' : discriminator}

 # Item subclasses omitted because that's irrelevant to the question.

2 个答案:

答案 0 :(得分:2)

我认为有一种更简单的方式......(我就是这样做的)

def adopt(parent_id,child_id):
    parent = DBSession.query(Item).get(parent_id)
    child  = DBSession.query(Item).get(child_id)
    parent.children.append(child)

答案 1 :(得分:0)

好的,问题解决了。

我正在创建一个insert语句对象,但没有执行它。

我有什么:

def adopt(parent_id, child_id):
    print('{} adopts {}'.format(parent_id, child_id))
    parents_children.insert(values=dict(parent_id=parent_id, child_id=child_id))

我现在所拥有的:

def adopt(parent_id, child_id):
    print('{} adopts {}'.format(parent_id, child_id))
    i = parents_children.insert(values=dict(parent_id=parent_id, child_id=child_id))
    conn = engine.connect()
    conn.execute(i)

现在一切都按预期工作了。

所以问题出在其他地方,而不是我在原帖中包含的片段。请随时删除该问题。