![fcbb16aeef7bd99ddba1ccf5a83b1328.png](https://i-blog.csdnimg.cn/blog_migrate/019a9a5397f6620c088b1604fc55c907.png)
15.relationship
中惰性查询
1.试理解relationship
(自己)
MySQL
是一个关系型数据库,关系型数据库最关键的就是关系.SQLAlchemy
作为一层ORM
对象关系映射,它是通过Model
的属性来模拟关系的.![]()
10206 对于他们的映射
![]()
10206 大致被映射成了如上关系.
表与表之间的关系,直接映射成了
Class
的一个relationship()
属性.表中字段之间的关系直接映射成一个一个class
类实例与另外 一个class
类实例之间的关系.比如如下最简单的一对多的关系:
class Parent2(Base):
__tablename__ = 'Parent_1'
p_id = Column(Integer, primary_key=True)
p_name = Column(String(45))
children = relationship('Child2', back_populates='parent')
class Child2(Base):
__tablename__ = 'Child_1'
c_id = Column(Integer, primary_key=True)
c_name = Column(String(45))
p_id = Column(Integer, ForeignKey('Parent_1.p_id'))
parent=relationship('Parent2', back_populates='children')那么
Parent
2 的实例p1
,就和多个Child2
的实例产生了关系(通过外键),比如c1,c2
.这样就完成了关系的抽象,也就是实现了面向对象的考虑.通过访问p1.children
就能访问到c1,c2
,这样从ORM
的角度简化了SQL
语句的查询.虽然底层实现的是
SQL
语句.但是我们只用考虑面向对象层面就行.这样又产生了新的问题,当访问
p1.children
时,会拿到所有的在Child2
类中对应的实例.如果数据量过多,会非常消耗资源(比如内存吃紧),有时候,只想去拿到p1.children
对应的个别实例.这样就需要对Parent1.children
这个给属性做出控制.
Paren1.children
是一个relationship()
对象,也就是对relationship()
做出控制.从
SQL
关系的角度看,这样就产生了惰性查询,也就是不返回所有的实例,而是返回一个Query
对象,让父类的属性再次操作Query
对象