【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()

 

posted @ 2018-04-11 23:02  小小易拉罐  阅读(5161)  评论(0编辑  收藏  举报