【问题标题】:SQLAlchemy - Parent child relationship in the same tableSQLAlchemy - 同一张表中的父子关系
【发布时间】:2012-10-06 05:44:52
【问题描述】:

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

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.

【问题讨论】:

  • 这很奇怪,你的代码看起来还不错。您可以包含添加子项目的代码吗?您是否检查过当您添加子项时,更改是否已提交到数据库?我认为这可能只是交易的怪异,而不是项目类本身的问题
  • @Sheena,我有这个从其他地方调用的方法:refheap.com/paste/5893
  • 我想我明白出了什么问题。插入语句对象已创建但从未执行。有没有办法使用会话对象来执行它?

标签: python mysql python-3.x sqlalchemy


【解决方案1】:

好的,问题解决了。

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

我有什么:

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)

现在一切正常。

所以问题出在我在原始帖子中包含的 sn-p 之外的其他地方。请随时删除问题。

【讨论】:

    【解决方案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)
    

    【讨论】:

    • 这当然更好。谢谢!
    • @missingfaktor: 没问题 :)
    猜你喜欢
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多