### 懒加载:
在一对多,或者多对多的时候,如果想要获取多的这一部分的数据的时候,往往能通过一个属性就可以全部获取了。比如有一个作者,想要或者这个作者的所有文章,那么可以通过user.articles就可以获取所有的。但有时候我们不想获取所有的数据,比如只想获取这个作者今天发表的文章,那么这时候我们可以给relationship传递一个lazy='dynamic',以后通过user.articles获取到的就不是一个列表,而是一个AppenderQuery对象了。这样就可以对这个对象再进行一层过滤和排序等操作。
通过`lazy='dynamic'`,获取出来的多的那一部分的数据,就是一个`AppenderQuery`对象了。这种对象既可以添加新数据,也可以跟`Query`一样,可以再进行一层过滤。
总而言之一句话:如果你在获取数据的时候,想要对多的那一边的数据再进行一层过滤,那么这时候就可以考虑使用`lazy='dynamic'`。
lazy可用的选项:
1. `select`:这个是默认选项。还是拿`user.articles`的例子来讲。如果你没有访问`user.articles`这个属性,那么sqlalchemy就不会从数据库中查找文章。一旦你访问了这个属性,那么sqlalchemy就会立马从数据库中查找所有的文章,并把查找出来的数据组装成一个列表返回。这也是懒加载。
2. `dynamic`:这个就是我们刚刚讲的。就是在访问`user.articles`的时候返回回来的不是一个列表,而是`AppenderQuery`对象。

 # coding:utf-8
# Author: liangjun.chen from datetime import datetime
from sqlalchemy import create_engine, Column, Integer, String, DateTime, Text, ForeignKey from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship, backref HOSTNAME = '127.0.0.1'
PORT = 3306
DATABASE = 'sqlalchemy_first'
USERNAME = 'root'
PASSWORD = '' DB_URI = 'mysql+pymysql://{username}:{password}@{host}:{port}/{dbname}?charset=utf8'.format(
username=USERNAME, password=PASSWORD, host=HOSTNAME, port=PORT, dbname=DATABASE
)
engine = create_engine(DB_URI)
Base = declarative_base(engine)
Session = sessionmaker(engine)
session = Session() # article
class Article(Base):
__tablename__ = 'article'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(String(50), nullable=False)
create_time = Column(DateTime,nullable=False, default=datetime.now)
uid = Column(Integer, ForeignKey("user.id")) # relation 正向引用, backref反向引用
author = relationship("User", backref=backref('articles', lazy='dynamic')) def __repr__(self):
return "Article <title: {}>".format(self.title) class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True, autoincrement=True)
username = Column(String(50), nullable=False) #
# Base.metadata.drop_all()
# Base.metadata.create_all()
#
# user = User(username='saber')
#
#
# for _ in xrange(100):
# article = Article(title='article{}'.format(_))
# article.author = user
# session.add(article)
# session.commit() user = session.query(User).first()
# 得到的是一个appendquery对象, 可读取, 可添加新数据
# 记得调用all()方法
print user.articles.filter(Article.id > 50).all() # 添加
article = Article(title='article101')
user.articles.append(article)
session.commit()

最新文章

  1. 【JUC】JDK1.8源码分析之ArrayBlockingQueue(三)
  2. 可能是史上最强大的js图表库——ECharts带你入门
  3. Java里this的作用和用法
  4. DOM(二)使用DOM
  5. SQL必知必会笔记(1)
  6. Redis的AOF功能
  7. [转]Sql Server 2005中的架构(Schema)、用户(User)、登录(Login)和角色(Role)
  8. one Infos
  9. Swift语言指南(六)--可选值
  10. HDU 2181 哈密顿绕行世界问题
  11. 转:webdriver驱动未在默认目录安装的firefox
  12. OpenStack Paste.ini详解(一)
  13. Maven入门指南⑦:Maven的生命周期和插件
  14. 访问内网(https,udp)
  15. #个人作业Week2——结对编程对象代码复审
  16. Scrapy学习篇(三)之创建项目和Scrapy的安装
  17. suricata 命令行解释【转】
  18. 转:如何解决“My mac 64-bit”问题
  19. 和IDEA一样好用的go语言IDE:Goland
  20. Hbase(四) 过滤器查询

热门文章

  1. 第二百零一节,jQuery EasyUI,Accordion(分类)组件
  2. Spring MVC生成RSS源
  3. jQuery 库 - 特性
  4. python 自动化之路 day 20 Django进阶/BBS项目【一】
  5. 解决ionic 2载入速度慢的问题
  6. 《PhotoShop CS6 》第一节 矢量与分辨率
  7. iOS学习笔记(十)——iOS真机调试
  8. [转]JavaWeb之 Servlet执行过程 与 生命周期
  9. windows解除端口占用
  10. 浅谈Spring框架注解的用法分析