【Flask】Sqlalchemy lazy

### 懶加載:
在一對多,或者多對多的時候,若是想要獲取多的這一部分的數據的時候,每每能經過一個屬性就能夠所有獲取了。好比有一個做者,想要或者這個做者的全部文章,那麼能夠經過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`對象。mysql

 

 1 # coding:utf-8
 2 # Author: liangjun.chen
 3 
 4 from datetime import datetime
 5 from sqlalchemy import create_engine, Column, Integer, String, DateTime, Text, ForeignKey
 6 
 7 from sqlalchemy.ext.declarative import declarative_base
 8 from sqlalchemy.orm import sessionmaker, relationship, backref
 9 
10 HOSTNAME = '127.0.0.1'
11 PORT = 3306
12 DATABASE = 'sqlalchemy_first'
13 USERNAME = 'root'
14 PASSWORD = '123456'
15 
16 DB_URI = 'mysql+pymysql://{username}:{password}@{host}:{port}/{dbname}?charset=utf8'.format(
17         username=USERNAME, password=PASSWORD, host=HOSTNAME, port=PORT, dbname=DATABASE
18 )
19 engine = create_engine(DB_URI)
20 Base = declarative_base(engine)
21 Session = sessionmaker(engine)
22 session = Session()
23 
24 
25 # article
26 class Article(Base):
27     __tablename__ = 'article'
28     id = Column(Integer, primary_key=True, autoincrement=True)
29     title = Column(String(50), nullable=False)
30     create_time = Column(DateTime,nullable=False, default=datetime.now)
31     uid = Column(Integer, ForeignKey("user.id"))
32 
33     # relation 正向引用, backref反向引用
34     author = relationship("User", backref=backref('articles', lazy='dynamic'))
35 
36     def __repr__(self):
37         return "Article <title: {}>".format(self.title)
38 
39 
40 class User(Base):
41     __tablename__ = 'user'
42     id = Column(Integer, primary_key=True, autoincrement=True)
43     username = Column(String(50), nullable=False)
44 
45 #
46 # Base.metadata.drop_all()
47 # Base.metadata.create_all()
48 #
49 # user = User(username='saber')
50 #
51 #
52 # for _ in xrange(100):
53 #     article = Article(title='article{}'.format(_))
54 #     article.author = user
55 #     session.add(article)
56 # session.commit()
57 
58 user = session.query(User).first()
59 # 獲得的是一個appendquery對象, 可讀取, 可添加新數據
60 # 記得調用all()方法
61 print user.articles.filter(Article.id > 50).all()
62 
63 # 添加
64 article = Article(title='article101')
65 user.articles.append(article)
66 session.commit()
相關文章
相關標籤/搜索