时间:2021-05-23
1. 返回列表和标量(Scalar)
前面我们注意到Query对象可以返回可迭代的值(iterator value),然后我们可以通过for in来查询。不过Query对象的all()、one()以及first()方法将返回非迭代值(non-iterator value),比如说all()返回的是一个列表:
>>> query = session.query(User).\>>> filter(User.name.like('%ed')).order_by(User.id)>>> query.all() SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_passwordFROM usersWHERE users.name LIKE ? ORDER BY users.id('%ed',) [User('ed','Ed Jones', 'f8s7ccs'), User('fred','Fred Flinstone', 'blah')]first()方法限制并仅作为标量返回结果集的第一条记录:
>>> query.first() SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_passwordFROM usersWHERE users.name LIKE ? ORDER BY users.id LIMIT ? OFFSET ?('%ed', 1, 0) <User('ed','Ed Jones', 'f8s7ccs')>one()方法,完整的提取所有的记录行,并且如果没有明确的一条记录行(没有找到这条记录)或者结果中存在多条记录行,将会引发错误异常NoResultFound或者MultipleResultsFound:
>>> from sqlalchemy.orm.exc import MultipleResultsFound>>> try: ... user = query.one()... except MultipleResultsFound, e:... print eSELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_passwordFROM usersWHERE users.name LIKE ? ORDER BY users.id('%ed',) Multiple rows were found for one()>>> from sqlalchemy.orm.exc import NoResultFound>>> try: ... user = query.filter(User.id == 99).one()... except NoResultFound, e:... print eSELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_passwordFROM usersWHERE users.name LIKE ? AND users.id = ? ORDER BY users.id('%ed', 99) No row was found for one()2. 使用原义SQL (Literal SQL)
Query对象能够灵活的使用原义SQL查询字符串作为查询参数,比如我们之前用过的filter()和order_by()方法:
>>> for user in session.query(User).\... filter("id<224").\... order_by("id").all(): ... print user.nameSELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_passwordFROM usersWHERE id<224 ORDER BY id() edwendymaryfred当然很多人可能会和我感觉一样,会有些不适应,因为使用ORM就是为了摆脱SQL语句的,没想到现在又看到SQL的影子了。呵呵,SQLAlchemy也要照顾到使用上的灵活性嘛,毕竟有些查询语句直接编入要容易得多。
当然绑定参数也可以用基于字符串的SQL指派,使用冒号来标记替代参数,然后再使用params()方法指定相应的值:
>>> session.query(User).filter("id<:value and name=:name").\... params(value=224, name='fred').order_by(User.id).one() SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_passwordFROM usersWHERE id<User('fred','Fred Flinstone', 'blah')>到这里,SQL语句的样子已经初见端倪了,其实我们可以更极端一点,直接使用SQL语句,什么?这样就失去ORM的价值了!别急,这里只是介绍一下支持这种用法,当然我建议不到万不得已,尽量不要这样写,因为可能会有兼容的问题,毕竟各个数据库的SQL方言不一样。不过有一点需要注意的是,如果要直接使用原生SQL语句,在被query()所查询的映射类中,你必须保证语句所指代的列仍然被映射类所管理,比如接下来的例子:
>>> session.query(User).from_statement(... "SELECT * FROM users where name=:name").\... params(name='ed').all()SELECT * FROM users where name=?('ed',) [<User('ed','Ed Jones', 'f8s7ccs')>]我们还可以在query()中直接使用列名来指派我们想要的列而摆脱映射类的束缚:
>>> session.query("id", "name", "thenumber12").\... from_statement("SELECT id, name, 12 as "... "thenumber12 FROM users where name=:name").\... params(name='ed').all()SELECT id, name, 12 as thenumber12 FROM users where name=?('ed',) [(1, u'ed', 12)]3. 计数 (Counting)
对于Query来说,计数功能也有个单独的方法称为count():
>>> session.query(User).filter(User.name.like('%ed')).count() SELECT count(*) AS count_1FROM (SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_passwordFROM usersWHERE users.name LIKE ?) AS anon_1('%ed',) 2count()方法被用于确定返回的结果集中有多少行,让我们观察一下产生的SQL语句,SQLAlchemy先是取出符合条件的所有行集合,然后再通过SELECT count(*)来统计有多少行。当然有点SQL知识的同学可能知道这条语句可以以更精简的方式写出来,比如SELECT count(*) FROM table,当然现代版本的SQLAlchemy不会去揣摩这样的想法。
假使我们要让查询语句更加精炼或者要明确要统计的列,我们可以通过表达式func.count()直接使用count函数,比如下面的例子介绍统计并返回每个唯一的用户名字:
>>> from sqlalchemy import func>>> session.query(func.count(User.name), User.name).group_by(User.name).all() SELECT count(users.name) AS count_1, users.name AS users_nameFROM users GROUP BY users.name() [(1, u'ed'), (1, u'fred'), (1, u'mary'), (1, u'wendy')]对于刚才提到的简单SELECT count(*) FROM table语句,我们可以通过下面的例子来实现:
>>> session.query(func.count('*')).select_from(User).scalar()SELECT count(?) AS count_1FROM users('*',) 4当然如果我们直接统计User的主键,上面的语句可以更加简练,我们可以省去select_from()方法:
>>> session.query(func.count(User.id)).scalar() SELECT count(users.id) AS count_1FROM users() 4声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
ORM框架使用最广泛的就是SQLAlchemy和Django自带的ORM框架,但是SQLAlchemy的语法显然相对Django的ORM框架麻烦一点。而Djan
一、SQLAlchemy简介1.1、SQLAlchemy是什么?sqlalchemy是一个python语言实现的的针对关系型数据库的orm库。可用于连接大多数常
本文实例讲述了Python流行ORM框架sqlalchemy安装与使用。分享给大家供大家参考,具体如下:安装http://docs.sqlalchemy.org
PythonORM概览作为一个美妙的语言,Python除了SQLAlchemy外还有很多ORM库。在这篇文章里,我们将来看看几个流行的可选ORM库,以此更好地窥
SQLAlchemy是Python编程语言下的一款开源软件,提供了SQL工具包及对象关系映射(ORM)工具,使用MIT许可证发行。SQLAlchemy首次发行于