Самореференциальная связь «многие к одному» в SQLAlchemy: пример - PullRequest
0 голосов
/ 01 мая 2019

Поскольку я следовал документации SQLAlchemy по отношениям списка смежности , я смог воспроизвести их пример Node следующим образом:

node_tree = Node(data='root', children=[
    Node(data='child1'),
    Node(data='child2', children=[
        Node(data='subchild1'),
        Node(data='subchild2'),
    ]),
    Node(data='child3'),
])

Однако я не смогсделайте то же самое для отношений «многие к одному».Как бы выглядел пример этого?

1 Ответ

1 голос
/ 01 мая 2019

Работа с примером и определением класса много-к-одному , предоставленным по вышеупомянутой ссылке (единственное отличие - добавленный аргумент remote_side), плюс хороший __repr__ для визуализации ...

class Node(Base):
    __tablename__ = 'node'
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey('node.id'))
    data = Column(String(50))
    parent = relationship("Node", remote_side=[id])

    def __repr__(self):
        return "Node(data={!r})".format(self.data)

# Create tree.
node_tree = Node(data='root')
child1 = Node(data='child1', parent=node_tree)
child2 = Node(data='child2', parent=node_tree)
subchild1 = Node(data='subchild1', parent=child2)
subchild2 = Node(data='subchild2', parent=child2)
child3 = Node(data='child3', parent=node_tree)

# For viewing the session as it works.
def print_session_state(operation):
    print(operation)
    print('new: {}'.format(session.new))
    print('dirty: {}\n'.format(session.dirty))

# When child2 is added...
session.add(child2)
print_session_state('add child2')
# Roll back.
session.rollback()
print_session_state('rollback')
# When subchild1 is added...
session.add(subchild1)
print_session_state('add subchild1')

Результат:

add child2
new: IdentitySet([Node(data='child2'), Node(data='root')])
dirty: IdentitySet([])

rollback
new: IdentitySet([])
dirty: IdentitySet([])

add subchild1
new: IdentitySet([Node(data='subchild1'), Node(data='child2'), Node(data='root')])
dirty: IdentitySet([])

Первое, что вы заметите, это то, что реализация не так хороша, поскольку на этот раз иерархия определяется снизу вверх.

Кроме того, каскадное поведение отличается. С отношением один ко многим каждый Node знал о своих дочерних элементах (множественное число), и каскадное движение проходило вниз по дереву.

При множестве «один к одному» каждый Node знает только о своем родительском (единственном числе), и каскадное движение проходит вверх по дереву, так что только те Node в одной и той же ветви дерево как отправная точка достигнута.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...