前期我们做了充足的准备工作现在该是关键内容之一查询了当然前面的文章中或多或少的穿插了些有关查询的东西黄浦区网站优化当然前面的文章中或多或少的穿插了些有关查询的东西比如一个查询(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’,)