sql关联查询子表的第一条_SQLAlchemy(8)惰性查询

fcbb16aeef7bd99ddba1ccf5a83b1328.png
10204

15.relationship 中惰性查询

1.试理解relationship(自己)

MySQL 是一个关系型数据库,关系型数据库最关键的就是关系.SQLAlchemy 作为一层ORM 对象关系映射,它是通过Model 的属性来模拟关系的.

fe0bc017acf8d5b4d623e36fbea58314.png
10206

对于他们的映射

0c3d31c3706e28b5b9ad9d399939f4ee.png
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')

那么Parent2 的实例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 对象

2.简单验证lazy=d
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值