Python ORM框架SQLAlchemy学习笔记之数据查询实例
前期我们做了充足的准备工作,现在该是关键内容之一查询了,当然前面的文章中或多或少的穿插了些有关查询的东西,比如一个查询(query)对象就是通过session会话的query()方法获取的,需要注意的是这个方法的参数数目是可变的,也就是说我们可以传入任意多的参数数目,参数的类型可以是任意的类组合或者是类的名称,接下来我们的例子就说明了这一点,我们让query对象加载了user实例。
>>> for instance in session.query(user).order_by(user.id):
... print instance.name, instance.fullname
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
()
ed ed jones
wendy wendy williams
mary mary contrary
fred fred flinstone
当然通过这个例子我们得到query对象返回的是一组可迭代的user实例表,然后我们通过for in语句访问,比如说这里可以依次输出“用户名”instance.name和“用户全名”instance.fullname。大家可能还注意到后面有个.order_by(user.id),这个和sql语句一样的,指示结果集按user.id所映射的表列进行排序。
假设我们仅仅只需要“用户名”和“用户全名”,对于对象实例的其他属性不感兴趣的话,也可以直接查询它们(类的属性名称),当然这里的前提是这个类必须是orm映射的,无论何时,任意数目的类实体或者基于列的实体均可以作为query()方法的参数,当然最终query对象会返回元组类型。
>>> for name, fullname in session.query(user.name, user.fullname):
... print name, fullname
select users.name as users_name,
users.fullname as users_fullname
from users
()
ed ed jones
wendy wendy williams
mary mary contrary
fred fred flinstone
返回的元组类型也可以被看作是普通的python对象,属性名称归属性名称,类型名称归类型名称,比如下面的例子:
>>> for row in session.query(user, user.name).all():
... print row.user, row.name
select users.id as users_id,
users.name as users_name,
users.fullname as users_fullname,
users.password as users_password
from users
()
<user('ed','ed jones', 'f8s7ccs')> ed
<user('wendy','wendy williams', 'foobar')> wendy
<user('mary','mary contrary', 'xxg527')> mary
<user('fred','fred flinstone', 'blah')> fred
当然你也可以搞点个性化,比如通过label()方法改变单独的列表达式名称,当然这个方法只有在映射到实体表的列元素对象(columnelement-derived)中存在(比如 user.name):
>>> for row in session.query(user.name.label('name_label')).all():
... print(row.name_label)
select users.name as name_label
from users
()
ed
wendy
mary
fred
之前我们看到查询对象实例必须用到实体类的全名(user),假设我们要多次使用这个实体类名作为查询对象(比如表连接操作)query()的参数,则我们可以给它取个“别名”,然后就可以通过别名来传入参数:
>>> 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
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
()
<user('ed','ed jones', 'f8s7ccs')>
<user('wendy','wendy williams', 'foobar')>
<user('mary','mary contrary', 'xxg527')>
<user('fred','fred flinstone', 'blah')>
学过mysql等这类数据库的同学可能知道limit和offset这两个sql操作,这个能够很方便的帮助我们控制记录的数目和位置,常常被用于数据分页操作,当然这类操作sqlalchemy的query对象已经帮我们想好了,而且很简单的可以通过python数组分片来实现,这个操作常常和order by一起使用:
>>> for u in session.query(user).order_by(user.id)[1:3]:
... print u
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 ?
(2, 1)
<user('wendy','wendy williams', 'foobar')>
<user('mary','mary contrary', 'xxg527')>
假如我们需要筛选过滤特定结果,则可以使用filter_by()方法,这个方法使用关键词参数:
>>> for name, in session.query(user.name).\
... filter_by(fullname='ed jones'):
... print name
select users.name as users_name from users
where users.fullname = ?
('ed jones',)
ed
或者使用filter()同样能达到目的,不过需要注意的是其使用了更加灵活的类似sql语句的表达式结构,这意味着你可以在其内部使用python自身的操作符,比如比较操作:
>>> for name, in session.query(user.name).\
... filter(user.fullname=='ed jones'):
... print name
select users.name as users_name from users
where users.fullname = ?
('ed jones',)
ed
注意这里的user.fullname=='ed jones',比较操作与ed jones相等的才筛选。
当然强大的query对象有个很有用的特性,那就是它是可以串联的,意味着query对象的每一步操作将会返回一个query对象,你可以将相同的方法串联到一起形成表达式结构,假如说我们要查询用户名为”ed”并且全名为”ed jones”的用户,你可以直接串联调用filter()两次,表示sql语句里的and连接:
>>> for user in session.query(user).\
... filter(user.name=='ed').\
... filter(user.fullname=='ed jones'):
... print user
select users.id as users_id,
users.name as users_name,
users.fullname as users_fullname,
users.password as users_password
from users
where users.name = ? and users.fullname = ?
('ed', 'ed jones')
<user('ed','ed jones', 'f8s7ccs')>
下面列举一些使用filter()常见的筛选过滤操作:
1. 相等
2. 不等
3. like
4. in
query.filter(user.name.in_(['ed', 'wendy', 'jack']))
# works with query objects too:
query.filter(user.name.in_(session.query(user.name).filter(user.name.like('%ed%'))))
5. not in
6. is null
7. is not null
8. and
from sqlalchemy import and_
filter(and_(user.name == 'ed', user.fullname == 'ed jones'))
# or call filter()/filter_by() multiple times
filter(user.name == 'ed').filter(user.fullname == 'ed jones')
9. or
from sqlalchemy import or_
filter(or_(user.name == 'ed', user.name == 'wendy'))
10. 匹配
query.filter(user.name.match('wendy'))
match()参数内容由数据库后台指定。(注:原文是“the contents of the match parameter are database backend specific.”,不太明白这个操作的意思)
好了,今天就介绍这么多,基本上都是蹩脚的翻译,希望对大家能够帮助
下一篇: 搜狐浏览器窗口全屏怎么开启?
推荐阅读
-
Python ORM框架SQLAlchemy学习笔记之数据查询实例
-
Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
-
Python ORM框架SQLAlchemy学习笔记之关系映射实例
-
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
-
Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍
-
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
-
Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
-
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
-
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
-
python orm框架SQLAlchemy简单应用(数据库操作)的实例代码