Kiedy próbuję SQLAlchemy Przykład relacji zgodnie z tym przewodnikiem: Podstawowe wzorce relacji
Mam ten kod
#!/usr/bin/env python
# encoding: utf-8
from sqlalchemy import create_engine
from sqlalchemy import Table, Column, Integer, ForeignKey
from sqlalchemy.orm import relationship, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine('sqlite:///:memory:', echo=True)
Session = sessionmaker(bind=engine)
session = Session()
Base = declarative_base(bind=engine)
class Parent(Base):
__tablename__ = 'parent'
id = Column(Integer, primary_key=True)
children = relationship("Child")
class Child(Base):
__tablename__ = 'child'
id = Column(Integer, primary_key=True)
parent_id = Column(Integer, ForeignKey('parent.id'))
parent = relationship("Parent")
Base.metadata.create_all()
p = Parent()
session.add(p)
session.commit()
c = Child(parent_id=p.id)
session.add(c)
session.commit()
print "children: {}".format(p.children[0].id)
print "parent: {}".format(c.parent.id)
Działa dobrze, ale w poradniku jest napisane, że model powinien być:
class Parent(Base):
__tablename__ = 'parent'
id = Column(Integer, primary_key=True)
**children = relationship("Child", back_populates="parent")**
class Child(Base):
__tablename__ = 'child'
id = Column(Integer, primary_key=True)
parent_id = Column(Integer, ForeignKey('parent.id'))
**parent = relationship("Parent", back_populates="children")**
Dlaczego nie potrzebuję back_populates
lub backref
na moim przykładzie? Kiedy powinienem użyć jednego lub drugiego?
źródło
back_populates
vsbackref
:backref
jest bardziej zwięzła, ponieważ nie musisz deklarować relacji na obu klasach, ale w praktyce nie warto zapisywać tego w sieci. Myślę, żeback_populates
jest lepsze, nie tylko dlatego, że w kulturze Pythona „Wyraźne jest lepsze niż niejawne” (Zen of Python), ale gdy masz wiele modeli, rzucając szybki rzut oka na jego deklarację, możesz zobaczyć wszystkie relacje i ich nazwy zamiast przechodzić wszystkie powiązane modele. Dodatkową zaletąback_populates
jest możliwość automatycznego uzupełniania w obu kierunkach na większości IDE =)parent_id
naprawdę konieczne pod dzieckiem? A co z tabelami pomocniczymi, jak wskazano w dokumentacjiparent_id
jest rzeczywiste pole klucza obcego, w którym jest przechowywana relacja rodzic-dziecko. Czy to jest to konieczne. Tabele pomocnicze służą do definiowania relacji wiele-do-wielu (na przykład, jeśli dziecko może mieć więcej niż jednego rodzica). Powyższy przykład fkey jest klasycznym przykładem indywidualnego, w którym każde dziecko ma jednego i tylko jednego rodzica, a rodzic może mieć wiele dzieci.