SQLAlchemy中的映射关系有四种,分别是一对多,多对一,一对一,多对多
一对多(one to many):
因为外键(ForeignKey)始终定义在多的一方.如果relationship定义在多的一方,那就是多对一,一对多与多对一的区别在于其关联(relationship)的属性在多的一方还是一的一方,如果relationship定义在一的一方那就是一对多.
这里的例子中,一指的是Parent,一个parent有多个child:
class Parent(Base):
__tablename__ = 'parent'
id = Column(Integer,primary_key = True)
children = relationship("Child",backref='parent')
class Child(Base):
__tablename__ = 'child'
id = Column(Integer,primary_key = True)
parent_id = Column(Integer,ForeignKey('parent.id'))
多对一(many to one):
这个例子中many是指parent了,意思是一个child可能有多个parent(父亲和母亲),这里的外键(child_id)和relationship(child)都定义在多(parent)的一方:
class Parent(Base):
__tablename__ = 'parent'
id = Column(Integer, primary_key=True)
child_id = Column(Integer, ForeignKey('child.id'))
child = relationship("Child", backref="parents")
class Child(Base):
__tablename__ = 'child'
id = Column(Integer, primary_key=True)
为了建立双向关系,可以在relationship()中设置backref,Child对象就有parents属性.设置 cascade= ‘all’,可以级联删除:
class Parent(Base):
__tablename__ = 'parent'
id = Column(Integer,primary_key = True)
children = relationship("Child",cascade='all',backref='parent')
def delete_parent():
session = Session()
parent = session.query(Parent).get(2)
session.delete(parent)
session.commit()
不过不设置cascade,删除parent时,其关联的chilren不会删除,只会把chilren关联的parent.id置为空,设置cascade后就可以级联删除children