python orm框架sqlalchemy_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

()

当然,也可以搞点个性化,比如通过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

()

学过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)

假如需要筛选过滤特定结果,则可以使用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')

列举一些使用filter()常见的筛选过滤操作: 代码示例:

1. 相等

query.filter(User.name == 'ed')

2. 不等

query.filter(User.name != 'ed')

3. LIKE

query.filter(User.name.like('%ed%'))

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

query.filter(~User.name.in_(['ed', 'wendy', 'jack']))

6. IS NULL

filter(User.name == None)

7. IS NOT NULL

filter(User.name != None)

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.”)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值