收藏 分享(赏)

python访问数据库, SQLAlchemy中的Query方法.doc

上传人:wspkg9802 文档编号:6974755 上传时间:2019-04-29 格式:DOC 页数:5 大小:52KB
下载 相关 举报
python访问数据库, SQLAlchemy中的Query方法.doc_第1页
第1页 / 共5页
python访问数据库, SQLAlchemy中的Query方法.doc_第2页
第2页 / 共5页
python访问数据库, SQLAlchemy中的Query方法.doc_第3页
第3页 / 共5页
python访问数据库, SQLAlchemy中的Query方法.doc_第4页
第4页 / 共5页
python访问数据库, SQLAlchemy中的Query方法.doc_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

1、SQLAlchemy 中的 Query 方法在 SQLAlchemy 中执行查询是通过 session 对象的 query 方法完成的。query 方法非常灵活,你可以根据需要使用不同的查询方式查找数据,下面一一举例。1.直接通过映射类查找:#Querying user instancefor instance in session.query(User).order_by(User.id):print instance.name,instance.fullname这种方法只要在 query 方法中,将映射类作为参数,就可以查询出这个映射类代表的数据库表中的数据。其相当于下面的 SQL 语句:

2、SELECT users.id AS users_id, users.name AS users_name,users.fullname AS users_fullname, users.password AS users_passwordFROM users ORDER BY users.id2.通过映射类的属性字段查询:#Querying by ORM-instrumentfor name,fullname in session.query(User.name,User.fullname):print name,fullname这种方法指定了查询的具体字段,而不是像第一种方法那样把映射类的

3、所有字段都查询出来,其相当于执行了下面的 SQL 语句:SELECT users.name AS users_name, users.fullname AS users_fullnameFROM users3.query 查询的结果是保存在一个元组中的,所以我们可以在 query 中指定返回整个的映射类对象和其中的部分属性字段:#Querying as a Python objectfor row in session.query(User,User.name).all():print row.User,row.name这种查询方法可以返回一个 User 对象以及它的 name 属性字段的值,

4、其相当于执行了下面的 SQL 语句:SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_passwordFROM users其输出结果为一个元组和一个字符串:user(“ed“,“Ed Jones“,“f8x902“) eduser(“Wendy“,“Wendy Williams“,“foobar“) Wendyuser(“Marry“,“Marry Contrary“,“xxg527“) Marryuser(“Fred“

5、,“Fred Flinstone“,“blah“) Fred4.我们还可以给返回的结果起一个别名,或者叫标签:#Querying labeledfor row in session.query(User.name.label(name_label).all():print (row.name_label)这里的关键是 label 方法,它的意思是把 User 的 name 字段改个名字叫 name_label,其相当于执行以下的 SQL 语句:SELECT users.name AS name_labelFROM users6.除了给映射类字段起别名,我们还可以给映射类起个别名:#Queryi

6、ng with aliasedfrom sqlalchemy.orm import aliaseduser_alias=aliased(User,name=user_alias)for row in session.query(user_alias,user_alias.name).all():print row.user_alias这里要注意的是,我们引入了 aliased 函数,并且给 User 映射类起了个别名叫user_alias。然后我们就可以在 query 中使用这个别名了,它相当于是 User 对象。上面的代码相当于执行了以下 SQL 语句:SELECT user_alias.i

7、d AS user_alias_id, user_alias.name AS user_alias_name,user_alias.fullname AS user_alias_fullname, user_alias.password AS user_alias_passwordFROM users AS user_alias7.由于 query 的查询返回的是一个元组,所以我们可以利用 Python 对数组类对象进行“分片”的操作,来限制返回的结果集范围:#Querying with limit and offsetfor u in session.query(User).order_by

8、(User.id)1:3:print u这里我们对返回的结果加上了1:3,来限制返回的结果集范围。其执行相当于下面的 SQL语句:SELECT users.id AS users_id, users.name AS users_name,users.fullname AS users_fullname, users.password AS users_passwordFROM users ORDER BY users.idLIMIT ? OFFSET ?8.前面的查询都没有涉及到子查询,也就是 SQL 的 where 子句。在 SQLAlchemy 框架中,query 的子查询可以通过 fil

9、ter_by 来实现:#Qyering with filter byfor name, in session.query(User.name).filter_by(fullname=Ed Jones):print name上面的查询相当于要找出 User 映射表中 fullname 为Ed Jones的数据,其相当于执行了下面的 SQL 语句:SELECT users.name AS users_nameFROM usersWHERE users.fullname = ?9.除了 filter_by 之外,我们还可以使用 filter 方法,这种方式看起来更灵活,我们可以按照映射类对象的属性来

10、指定查询条件:#Querying with filterfor name, in session.query(User.name).filter(User.fullname=Ed Jones):print name其参数与 filter_by 不同,这里使用了映射类名加属性字段的方式来指定查询子句参数,其相当于执行了下面的 SQL 语句:SELECT users.name AS users_nameFROM usersWHERE users.fullname = ?如果我们想要嵌套多个查询条件,可以嵌套多个 filter:#Querying with fully generativefor n

11、ame, in session.query(User.name).filter(User.fullname=Ed Jones).filter(User.name=ed):print name可以看到我们在 filter 方法后面又嵌套了一个 filter,理论上可以嵌套无数个,其相当于执行了下面的 SQL 语句:SELECT users.name AS users_nameFROM usersWHERE users.fullname = ? AND users.name = ?完整的示例代码如下:from sqlalchemy.ext.declarative import declarativ

12、e_basefrom sqlalchemy import Column,Integer,Stringfrom sqlalchemy import Sequencefrom sqlalchemy.orm import sessionmakerBase=declarative_base()from sqlalchemy import create_engineengine=create_engine(sqlite:/:memory:,echo=True)class User(Base):_tablename_=usersid=Column(Integer,Sequence(user_id_seq)

13、,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=sessio

14、nmaker(bind=engine)session=Session()#Add on usered_user=User(ed,Ed Jones,edpassword)session.add(ed_user)#Retrive saved ed_userour_user=session.query(User).filter_by(name=ed).first()print our_user is:,our_userprint our_user id is:,our_user.idprint our_user is ed_user,our_user=ed_user#Add multiple obj

15、ectsession.add_all(User(Wendy,Wendy Williams,foobar),User(Marry,Marry Contrary,xxg527),User(Fred,Fred Flinstone,blah)#Detective the dirty dataed_user.password=f8x902print Dirty data,session.dirty#Detective the new dataprint New data,session.new#Commit mit()#=Querying=#Querying user instancefor insta

16、nce in session.query(User).order_by(User.id):print instance.name,instance.fullname#Querying by ORM-instrumentfor name,fullname in session.query(User.name,User.fullname):print name,fullname#Querying as a Python objectfor row in session.query(User,User.name).all():print row.User,row.name#Querying labe

17、ledfor row in session.query(User.name.label(name_label).all():print (row.name_label)#Querying with aliasedfrom sqlalchemy.orm import aliaseduser_alias=aliased(User,name=user_alias)for row in session.query(user_alias,user_alias.name).all():print row.user_alias#Querying with limit and offsetfor u in s

18、ession.query(User).order_by(User.id)1:3:print u#Qyering with filter byfor name, in session.query(User.name).filter_by(fullname=Ed Jones):print name#Querying with filterfor name, in session.query(User.name).filter(User.fullname=Ed Jones):print name#Querying with fully generativefor name, in session.query(User.name).filter(User.fullname=Ed Jones).filter(User.name=ed):print namePython 标准函数库, SQLAlcehemy

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报