python访问数据库, SQLAlchemy中的Query方法
- 格式:doc
- 大小:52.00 KB
- 文档页数:5
SQLAlchemy中的Query方法
在SQLAlchemy中执行查询是通过session对象的query方法完成的。query方法非常灵活,你可以根据需要使用不同的查询方式查找数据,下面一一举例。
1.直接通过映射类查找:
#Querying user instance
for instance in session.query(User).order_by(User.id):
print ,instance.fullname
这种方法只要在query方法中,将映射类作为参数,就可以查询出这个映射类代表的数据库表中的数据。其相当于下面的SQL语句:
SELECT users.id AS users_id, 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.fullname):
print name,fullname
这种方法指定了查询的具体字段,而不是像第一种方法那样把映射类的所有字段都查询出来,其相当于执行了下面的SQL语句:
SELECT AS users_name, users.fullname AS users_fullname
FROM users
3.query查询的结果是保存在一个元组中的,所以我们可以在query中指定返回整个的映射类对象和其中的部分属性字段:
#Querying as a Python object
for row in session.query(User,).all():
print er,
这种查询方法可以返回一个User对象以及它的name属性字段的值,其相当于执行了下面的SQL语句:
SELECT users.id AS users_id, AS users_name, users.fullname AS
users_fullname, users.password AS users_password
FROM users
其输出结果为一个元组和一个字符串:
<user("ed","Ed Jones","f8x902")> ed
<user("Wendy","Wendy Williams","foobar")> Wendy
<user("Marry","Marry Contrary","xxg527")> Marry
<user("Fred","Fred Flinstone","blah")> Fred
4.我们还可以给返回的结果起一个别名,或者叫标签:
#Querying labeled
for row in session.query(bel('name_label')).all():
print (_label)
这里的关键是label方法,它的意思是把User的name字段改个名字叫name_label,其相当于执行以下的SQL语句:
SELECT 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_).all():
print er_alias
这里要注意的是,我们引入了aliased函数,并且给User映射类起了个别名叫user_alias。然后我们就可以在query中使用这个别名了,它相当于是User对象。上面的代码相当于执行了以下SQL语句:
SELECT user_alias.id AS user_alias_id, user_ 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, 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().filter_by(fullname='Ed Jones'):
print name
上面的查询相当于要找出User映射表中fullname为’Ed Jones’的数据,其相当于执行了下面的SQL语句:
SELECT AS users_name
FROM users
WHERE users.fullname = ?
9.除了filter_by之外,我们还可以使用filter方法,这种方式看起来更灵活,我们可以按照映射类对象的属性来指定查询条件: