SQLAlchemy中的Query方法在SQLAlchemy中执行查询是通过session对象的query方法完成的。query方法非常灵活,你可以根据需要使用不同的查询方式查找数据,下面一一举例。1.直接通过映射类查找:#Queryinguserinstanceforinstanceinsession.query(User).order_by(User.id):printinstance.name,instance.fullname这种方法只要在query方法中,将映射类作为参数,就可以查询出这个映射类代表的数据库表中的数据。其相当于下面的SQL语句:SELECTusers.idASusers_id,users.nameASusers_name,users.fullnameASusers_fullname,users.passwordASusers_passwordFROMusersORDERBYusers.id2.通过映射类的属性字段查询:#QueryingbyORM-instrumentforname,fullnameinsession.query(User.name,User.fullname):printname,fullname这种方法指定了查询的具体字段,而不是像第一种方法那样把映射类的所有字段都查询出来,其相当于执行了下面的SQL语句:SELECTusers.nameASusers_name,users.fullnameASusers_fullnameFROMusers3.query查询的结果是保存在一个元组中的,所以我们可以在query中指定返回整个的映射类对象和其中的部分属性字段:#QueryingasaPythonobjectforrowinsession.query(User,User.name).all():printrow.User,row.name这种查询方法可以返回一个User对象以及它的name属性字段的值,其相当于执行了下面的SQL语句:SELECTusers.idASusers_id,users.nameASusers_name,users.fullnameASusers_fullname,users.passwordASusers_passwordFROMusers其输出结果为一个元组和一个字符串:/spanuser(ed,EdJones,f8x902)ed/spanuser(Wendy,WendyWilliams,foobar)Wendy/spanuser(Marry,MarryContrary,xxg527)Marry/spanuser(Fred,FredFlinstone,blah)Fred4.我们还可以给返回的结果起一个别名,或者叫标签:#Queryinglabeledforrowinsession.query(User.name.label('name_label')).all():print(row.name_label)这里的关键是label方法,它的意思是把User的name字段改个名字叫name_label,其相当于执行以下的SQL语句:SELECTusers.nameASname_labelFROMusers6.除了给映射类字段起别名,我们还可以给映射类起个别名:#Queryingwithaliasedfromsqlalchemy.ormimportaliaseduser_alias=aliased(User,name='user_alias')forrowinsession.query(user_alias,user_alias.name).all():printrow.user_alias这里要注意的是,我们引入了aliased函数,并且给User映射类起了个别名叫user_alias。然后我们就可以在query中使用这个别名了,它相当于是User对象。上面的代码相当于执行了以下SQL语句:SELECTuser_alias.idASuser_alias_id,user_alias.nameASuser_alias_name,user_alias.fullnameASuser_alias_fullname,user_alias.passwordASuser_alias_passwordFROMusersASuser_alias7.由于query的查询返回的是一个元组,所以我们可以利用Python对数组类对象进行“分片”的操作,来限制返回的结果集范围:#Queryingwithlimitandoffsetforuinsession.query(User).order_by(User.id)[1:3]:printu这里我们对返回的结果加上了[1:3],来限制返回的结果集范围。其执行相当于下面的SQL语句:SELECTusers.idASusers_id,users.nameASusers_name,users.fullnameASusers_fullname,users.passwordASusers_passwordFROMusersORDERBYusers.idLIMIT?OFFSET?8.前面的查询都没有涉及到子查询,也就是SQL的where子句。在SQLAlchemy框架中,query的子查询可以通过filter_by来实现:#Qyeringwithfilterbyforname,insession.query(User.name).filter_by(fullname='EdJones'):printname上面的查询相当于要找出User映射表中fullname为’EdJones’的数据,其相当于执行了下面的SQL语句:SELECTusers.nameASusers_nameFROMusersWHEREusers.fullname=?9.除了filter_by之外,我们还可以使用filter方法,这种方式看起来更灵活,我们可以按照映射类对象的属性来指定查询条件:#Queryingwithfilterforname,insession.query(User.name).filter(User.fullname=='EdJones'):printname其参数与filter_by不同,这里使用了映射类名加属性字段的方式来指定查询子句参数,其相当于执行了下面的SQL语句:SELECTusers.nameASusers_nameFROMusersWHEREusers.fullname=?如果我们想要嵌套多个查询条件,可以嵌套多个filter:#Queryingwithfullygenerativeforname,insession.query(User.name).filter(User.fullname=='EdJones').filter(User.name=='ed'):printname可以看到我们在filter方法后面又嵌套了一个filter,理论上可以嵌套无数个,其相当于执行了下面的SQL语句:SELECTusers.nameASusers_nameFROMusersWHEREusers.fullname=?ANDusers.name=?完整的示例代码如下:fromsqlalchemy.ext.declarativeimportdeclarative_basefromsqlalchemyimportColumn,Integer,StringfromsqlalchemyimportSequencefromsqlalchemy.ormimportsessionmakerBase=declarative_base()fromsqlalchemyimportcreate_engineengine=create_engine('sqlite:///:memory:',echo=True)classUser(Base):__tablename__='users'id=Column(Integer,Sequence('user_id_seq'),primary_key=True)name=Column(String(50))fullname=Column(String(50))password=Column(String(12))def__init__(self,name,fullname,password):self.name=nameself.fullname=fullnameself.password=passworddef__repr__(self):return''%(self.name,self.fullname,self.password)Base.metadata.create_all(engine)Session=sessionmaker(bind=engine)session=Session()#Addonusered_user=User('ed','EdJones','edpassword')session.add(ed_user)#Retrivesaveded_userour_user=session.query(User).filter_by(name='ed').first()print'our_useris:',our_userprint'our_useridis:',our_user.idprint'our_userised_user',our_user==ed_user#Addmultipleobjectsession.add_all([User('Wendy','WendyWilliams','foobar'),User('Marry','MarryContrary','xxg527'),User('Fred','FredFlinstone','blah')])#Detectivethedirtydataed_user.password='f8x902'print'Dirtydata',session.dirty#Detectivethenewdataprint'Newdata',session.new#Commitdatasession.commit()#========Querying===============#Queryinguserinstanceforinstanceinsession.query(User).order_by(User.id):printinstance.name,instance.fullname#QueryingbyORM-instrumentforname,fullnameinsession.query(User.name,User.fullname):printname,fullname#QueryingasaPythonobjectforrowinsession.query(User,User.name).all():printrow.User,row.name#Queryinglabeledforrowinsession.query(User.name.label('name_label')).all():print(row.name_label)#Queryingwithaliasedfromsqlalchemy.ormimportaliaseduser_alias=aliased(User,name='user_alias')forrowinsession.query(user_alias,user_alias.name).all():printrow.user_alias#Queryingwithlimitandoffsetforuinsession.query(User).order_by(User.id)[1:3]:printu#Qyeringwithfilterbyforname,insession.query(User.name