Khi tôi thử Ví dụ quan hệ SQLAlchemy theo hướng dẫn này: Các mẫu quan hệ cơ bản
Tôi có mã này
#!/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)
Nó hoạt động tốt, nhưng trong hướng dẫn, nó nói rằng mô hình phải là:
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")**
Tại sao tôi không cần back_populates
hoặc backref
trong ví dụ của tôi? Khi nào tôi nên sử dụng cái này hay cái kia?
back_populates
vsbackref
:backref
ngắn gọn hơn vì bạn không cần phải khai báo mối quan hệ trên cả hai lớp, nhưng trong thực tế, tôi thấy không đáng để lưu nó trên dòng. Tôi nghĩback_populates
là tốt hơn, không chỉ bởi vì trong văn hóa python "Rõ ràng tốt hơn ẩn" (Zen của Python), mà khi bạn có nhiều mô hình, chỉ cần nhìn lướt qua phần khai báo của nó, bạn có thể thấy tất cả các mối quan hệ và tên của chúng thay vì lướt qua tất cả các mô hình liên quan. Ngoài ra, một lợi ích phụ tốt đẹp củaback_populates
là bạn có được tự động hoàn tất trên cả hai hướng trên hầu hết các IDE =)