Wenn ich SQLAlchemy Relation Example versuche, folge dieser Anleitung: Grundlegende Beziehungsmuster
Ich habe diesen Code
#!/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)
Es funktioniert gut, aber in der Anleitung heißt es, dass das Modell sein sollte:
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")**
Warum brauche ich nicht back_populates
oder backref
in meinem Beispiel? Wann sollte ich den einen oder anderen verwenden?
quelle
back_populates
vsbackref
:backref
ist prägnanter, da Sie die Beziehung nicht für beide Klassen deklarieren müssen, aber in der Praxis finde ich es nicht wert, dies online zu speichern. Ich denke, esback_populates
ist besser, nicht nur, weil in der Python-Kultur "Explizit ist besser als implizit" (Zen of Python), sondern wenn Sie viele Modelle haben, können Sie mit einem kurzen Blick auf die Deklaration alle Beziehungen und ihre Namen sehen, anstatt darüber hinwegzugehen alle verwandten Modelle. Ein netter Nebeneffektback_populates
ist auch, dass Sie bei den meisten IDEs automatisch in beide Richtungen vervollständigen =)parent_id
wirklich notwendig unter Kind? Und was ist mit Hilfstabellen, wie in der Dokumentation angegebenparent_id
ist das eigentliche Fremdschlüsselfeld, in dem die Eltern-Kind-Beziehung gespeichert ist. Es ist notwendig. Hilfstabellen dienen zum Definieren von Viele-zu-Viele-Beziehungen (z. B. wenn ein Kind mehr als ein Elternteil haben könnte). Das obige Beispiel ist das klassische Eins-zu-Manay-Beispiel, bei dem jedes Kind einen und nur einen Elternteil hat und ein Elternteil viele Kinder haben kann.