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

SQLAlchemy中的Query方法


在SQLAlchemy中执行查询是通过session对象的query方法完成的。query方法非常灵活,你可以根据需要使用不同的查询方式查找数据,下面一一举例。
1.直接通过映射类查找:

#Querying user instance
for instance  in session. query (User ). order_by (User. id ):
       print instance. name ,instance. fullname

这种方法只要在query方法中,将映射类作为参数,就可以查询出这个映射类代表的数据库表中的数据。其相当于下面的SQL语句:

SELECT users .id  AS users_id , users .name  AS users_name ,
users .fullname  AS users_fullname , users .password  AS users_password
FROM users  ORDER  BY users .id

2.通过映射类的属性字段查询:

#Querying by ORM-instrument
for name ,fullname  in session. query (User. name ,User. fullname ):
       print name ,fullname

这种方法指定了查询的具体字段,而不是像第一种方法那样把映射类的所有字段都查询出来,其相当于执行了下面的SQL语句:

SELECT users .name  AS users_name , users .fullname  AS users_fullname
FROM users

3.query查询的结果是保存在一个元组中的,所以我们可以在query中指定返回整个的映射类对象和其中的部分属性字段:

#Querying as a Python object
for row  in session. query (User ,User. name ). all ( ):
       print row. User ,row. name

这种查询方法可以返回一个User对象以及它的name属性字段的值,其相当于执行了下面的SQL语句:

SELECT users .id  AS users_id , users .name  AS users_name , users .fullname  AS users_fullname , users .password  AS users_password
FROM users

其输出结果为一个元组和一个字符串:

<</span>user("ed","Ed Jones","f8x902")> ed
<</span>user("Wendy","Wendy Williams","foobar")> Wendy
<</span>user("Marry","Marry Contrary","xxg527")> Marry
<</span>user("Fred","Fred Flinstone","blah")> Fred

4.我们还可以给返回的结果起一个别名,或者叫标签:

#Querying labeled
for 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_label
FROM users

6.除了给映射类字段起别名,我们还可以给映射类起个别名:

#Querying with aliased
from sqlalchemy. orm  import aliased
user_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 .id  AS user_alias_id , user_alias .name  AS user_alias_name ,
user_alias .fullname  AS user_alias_fullname , user_alias .password  AS user_alias_password
FROM users  AS user_alias

7.由于query的查询返回的是一个元组,所以我们可以利用Python对数组类对象进行“分片”的操作,来限制返回的结果集范围:

#Querying with limit and offset
for u  in session. query (User ). order_by (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_password
FROM users  ORDER  BY users .id
  LIMIT ? OFFSET ?

8.前面的查询都没有涉及到子查询,也就是SQL的where子句。在SQLAlchemy框架中,query的子查询可以通过filter_by来实现:

#Qyering with filter by
for name ,  in session. query (User. name ). filter_by (fullname = 'Ed Jones' ):
       print name

上面的查询相当于要找出User映射表中fullname为’Ed Jones’的数据,其相当于执行了下面的SQL语句:

SELECT users .name  AS users_name
FROM users
WHERE users .fullname  = ?

9.除了filter_by之外,我们还可以使用filter方法,这种方式看起来更灵活,我们可以按照映射类对象的属性来指定查询条件:

#Querying with filter
for name ,  in session. query (User. name ). filter (User. fullname == 'Ed Jones' ):
       print name

其参数与filter_by不同,这里使用了映射类名加属性字段的方式来指定查询子句参数,其相当于执行了下面的SQL语句:

SELECT users .name  AS users_name
FROM users
WHERE users .fullname  = ?

如果我们想要嵌套多个查询条件,可以嵌套多个filter:

#Querying with fully generative
for name ,  in session. query (User. name ). filter (User. fullname == 'Ed Jones' ). filter (User. name == 'ed' ):
       print name

可以看到我们在filter方法后面又嵌套了一个filter,理论上可以嵌套无数个,其相当于执行了下面的SQL语句:

SELECT users .name  AS users_name
FROM users
WHERE users .fullname  = ?  AND users .name  = ?

完整的示例代码如下:

from sqlalchemy. ext. declarative  import declarative_base
from sqlalchemy  import Column ,Integer ,String
from sqlalchemy  import Sequence
from sqlalchemy. orm  import sessionmaker
Base =declarative_base ( )
from sqlalchemy  import create_engine
engine =create_engine ( 'sqlite:///:memory:' ,echo = True )
class User (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 =name
             self. fullname =fullname
             self. password =password

       def  __repr__ ( self ):
             return  '' % ( self. name , self. fullname , self. password )
Base. metadata. create_all (engine )
Session =sessionmaker (bind =engine )
session =Session ( )
#Add on user
ed_user =User ( 'ed' , 'Ed Jones' , 'edpassword' )
session. add (ed_user )
#Retrive saved ed_user
our_user =session. query (User ). filter_by (name = 'ed' ). first ( )
print  'our_user is:' ,our_user
print  'our_user id is:' ,our_user. id
print  'our_user is ed_user' ,our_user ==ed_user

#Add multiple object
session. add_all (
       [
            User ( 'Wendy' , 'Wendy Williams' , 'foobar' ) ,
            User ( 'Marry' , 'Marry Contrary' , 'xxg527' ) ,
            User ( 'Fred' , 'Fred Flinstone' , 'blah' )
       ]
)
#Detective the dirty data
ed_user. password = 'f8x902'
print  'Dirty data' ,session. dirty
#Detective the new data
print  'New data' ,session. new
#Commit data
session. commit ( )
#========Querying===============
#Querying user instance
for instance  in session. query (User ). order_by (User. id ):
       print instance. name ,instance. fullname
#Querying by ORM-instrument
for name ,fullname  in session. query (User. name ,User. fullname ):
       print name ,fullname
#Querying as a Python object
for row  in session. query (User ,User. name ). all ( ):
       print row. User ,row. name

#Querying labeled
for row  in session. query (User. name. label ( 'name_label' ) ). all ( ):
       print  (row. name_label )
#Querying with aliased
from sqlalchemy. orm  import aliased
user_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 offset
for u  in session. query (User ). order_by (User. id ) [ 1: 3 ]:
       print u
#Qyering with filter by
for name ,  in session. query (User. name ). filter_by (fullname = 'Ed Jones' ):
       print name
#Querying with filter
for name ,  in session. query (User. name ). filter (User. fullname == 'Ed Jones' ):
       print name
#Querying with fully generative
for name ,  in session. query (User. name ). filter (User. fullname == 'Ed Jones' ). filter (User. name == 'ed' ):
       print name


Python标准函数库SQLAlcehemy



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值