### subquery:
子查詢能夠讓多個查詢變成一個查詢,只要查找一次數據庫,性能相對來說更加高效一點。不用寫多個sql語句就能夠實現一些複雜的查詢。那麼在sqlalchemy中,要實現一個子查詢,應該使用如下幾個步驟:
1. 將子查詢按照傳統的方式寫好查詢代碼,而後在`query`對象後面執行`subquery`方法,將這個查詢變成一個子查詢。
2. 在子查詢中,將之後須要用到的字段經過`label`方法,取個別名。
3. 在父查詢中,若是想要使用子查詢的字段,那麼能夠經過子查詢的返回值上的`c`屬性拿到。
總體的示例代碼以下:mysql
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()