Я пытаюсь описать отношения «один ко многим» с помощью SQLAlchemy, но я не могу связать два объекта напрямую из-за конструкции самой базы данных.
____________ _______________________ _____________
|...parent...| |....parent_children....| ------> |....child....|
|============| |=======================| |=============|
|--int: id---|---> |----int: child_id------| ------> |---int: id---|
|------------| |----int: parent_id-----| |-------------|
|____________| |_______________________| ------> |_____________|
В чистом SQL мне пришлось бы сделать это:
-- Finding the parent of a child
SELECT p.*
FROM child c
INNER JOIN parent_children pc ON pc.child_id = c.id
INNER JOIN parent p ON pc.parent_id = p.id
WHERE c.id = 2323 -- example
-- Finding parent childrens
SELECT c.*
FROM parent p
INNER JOIN parent_children pc ON pc.parent_id = p.id
INNER JOIN child c ON pc.child_id = c.id
WHERE p.id = 32323 -- example****
Вот уменьшенная модель:
class Parent(Base):
__tablename__ = 'parent'
id = Column(Integer, primary_key=True)
children = # TODO: HOW TO populate the list of childrens here?
class ParentChild(Base):
__tablename__ = 'parent_children'
child_id = Column(Integer, ForeignKey('child.id'))
parent_id = Column(Integer, ForeignKey('parent.id'))
class Child(Base):
__tablename__ = 'child'
id = Column(Integer, primary_key=True)
parent = # TODO: How to populate the parent of this child here?
Я пытался следовать эта документация, рассматривая ParentChild как ассоциированную таблицу, но в итоге он добавляет child_id и parent_id всякий раз, когда я использую его для связывания этих двух, поскольку я не связываю Parent с Child напрямую, а скорее Parent с ParentChild.
@GordThompson Действительно, ты прав. После тщательного исследования реальной модели новичком я пришел к решению, используя то, что вы указали. Я отвечу на свой вопрос кодом, на всякий случай, если кто-то столкнется с этим в будущем.





class ParentChild(Base):
__tablename__ = 'parent_children'
child_id = Column(Integer, ForeignKey('child.id'), nullable=False, primary_key=True, unique=True)
parent_id = Column(Integer, ForeignKey('parent.id'), index=True, nullable=False)
# ForeignKeyConstraint(['parent_id'], ['parent.id'],
# use_alter=True, name='name_this_constraint_1')
# UniqueConstraint('child_id', 'child.id', name='name_this_unique_constraint_2')
# ForeignKeyConstraint(['child_id'], ['child.id'],
# use_alter=True, name='name_this_constraint__3')
class Child(Base):
__tablename__ = 'child'
id = Column(Integer, primary_key=True)}
class Parent(Base):
__tablename__ = 'parent'
id = Column(Integer, primary_key=True)
children = relationship('Child',
secondary='parent_children',
)
Похоже, вы хотите сделать то же самое, что и отношение «многие ко многим», с добавлением уникального ограничения для
child_idв таблице ассоциаций.