• 【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`对象。

     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()
  • 相关阅读:
    副本集-Replica Sets
    SpringBoot整合SpringData MongoDB
    Auth认证
    Form
    flask一些插件
    SQLAlchemy
    session
    上下文
    flask路由
    Flask中间件
  • 原文地址:https://www.cnblogs.com/chen0427/p/8784507.html
Copyright © 2020-2023  润新知