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?
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 =)