zoukankan      html  css  js  c++  java
  • 【Flask】Sqlalchemy 子查询

    ### subquery:
    子查询可以让多个查询变成一个查询,只要查找一次数据库,性能相对来讲更加高效一点。不用写多个sql语句就可以实现一些复杂的查询。那么在sqlalchemy中,要实现一个子查询,应该使用以下几个步骤:
    1. 将子查询按照传统的方式写好查询代码,然后在`query`对象后面执行`subquery`方法,将这个查询变成一个子查询。
    2. 在子查询中,将以后需要用到的字段通过`label`方法,取个别名。
    3. 在父查询中,如果想要使用子查询的字段,那么可以通过子查询的返回值上的`c`属性拿到。
    整体的示例代码如下:

     1 # coding:utf-8
     2 # Author: liangjun.chen
     3 
     4 from datetime import datetime
     5 from sqlalchemy import create_engine, Column, Integer, String, Enum, func
     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 
    26 class User(Base):
    27     __tablename__ = 'user'
    28     id = Column(Integer, primary_key=True, autoincrement=True)
    29     username = Column(String(50), nullable=False)
    30     city = Column(String(50), nullable=False)
    31     age = Column(Integer, default=0)
    32 
    33     def __repr__(self):
    34         return "User<{}>".format(self.username)
    35 
    36 # Base.metadata.drop_all()
    37 # Base.metadata.create_all()
    38 #
    39 # user = User(username='saber', city=u'上海', age=18)
    40 # user2 = User(username='saber2', city=u'上海',age=18)
    41 # user3 = User(username='saber3', city=u'北京', age=18)
    42 # user4 = User(username='saber4', city=u'上海', age=19)
    43 #
    44 #
    45 # session.add_all([user, user2, user3, user4])
    46 # session.commit()
    47 
    48 # 查询和saber同城市, 并且是同年龄的人.(原始查询)
    49 user = session.query(User).filter(User.username == 'saber').first()
    50 users = session.query(User).filter(User.city==user.city, User.age==user.age).all()
    51 print user
    52 print users
    53 
    54 
    55 # 子查询
    56 subq = session.query(User.city.label('city'), User.age.label('age')).filter(User.username=='saber').subquery()
    57 users = session.query(User).filter(User.city==subq.c.city, User.age==subq.c.age)
    58 print users
    59 print users.all()
  • 相关阅读:
    Oracle常用系统查询SQL
    easyui中使用的遮罩层
    EasyUI相同的Tab只打开一个(即EasyUI方法的调用方法)
    jQueryEasyUI创建菜单主页
    linux 的环境变量的配置文件
    angular reactive form
    svn代码回滚
    golang restful api
    golang embedded structs
    Angular Multiple HTTP Requests with RxJS
  • 原文地址:https://www.cnblogs.com/chen0427/p/8799314.html
Copyright © 2011-2022 走看看