Rolling Back
由于 "会话 "在事务中工作,我们也可以回滚所做的更改。让我们做两个变化,之后我们将恢复回之前的状态;ed_user
的用户名被设置为Edwardo
。
>>> ed_user.name = 'Edwardo'
我们再增加一个错误的用户,fake_user
。
>>> fake_user = User(name='fakeuser', fullname='Invalid', nickname='12345')
>>> session.add(fake_user)
查询会话,我们可以看到它们被冲入了当前的事务中。
SQL>>> session.query(User).filter(User.name.in_(['Edwardo', 'fakeuser'])).all()
[<User(name='Edwardo', fullname='Ed Jones', nickname='eddie')>, <User(name='fakeuser', fullname='Invalid', nickname='12345')>]
向后滚动,我们可以看到ed_user
的名字又回到了ed
,而fake_user
已经被踢出了会话。
SQL>>> session.rollback()
SQL>>> ed_user.name
u'ed'
>>> fake_user in session
False
发出SELECT说明对数据库进行了修改。
SQL>>> session.query(User).filter(User.name.in_(['ed', 'fakeuser'])).all()
[<User(name='ed', fullname='Ed Jones', nickname='eddie')>]
Querying
使用 Session
上的query()
方法创建一个 Query
对象。这个函数需要一个可变数量的参数,这些参数可以是类和类实例描述符的任意组合。下面,我们表示一个加载User
实例的Query
。当在迭代上下文中评估时,将返回存在的User
对象列表。
SQL>>> for instance in session.query(User).order_by(User.id):
... print(instance.name, instance.fullname)
ed Ed Jones
wendy Wendy Williams
mary Mary Contrary
fred Fred Flintstone
Query
也接受ORM说明的描述符作为参数。任何时候,当多个类实体或基于列的实体被表示为query()
函数的参数时,返回的结果都表示为元组。
SQL>>> for name, fullname in session.query(User.name, User.fullname):
... print(name, fullname)
ed Ed Jones
wendy Wendy Williams
mary Mary Contrary
fred Fred Flintstone
Query
返回的元组由Row
类提供,可以像对待普通的Python对象一样对待。这些名称与属性的属性名和类的类名是一样的。
SQL>>> for row in session.query(User, User.name).all():
... print(row.User, row.name)
<User(name='ed', fullname='Ed Jones', nickname='eddie')> ed
<User(name='wendy', fullname='Wendy Williams', nickname='windy')> wendy
<User(name='mary', fullname='Mary Contrary', nickname='mary')> mary
<User(name='fred', fullname='Fred Flintstone', nickname='freddy')> fred
可以使用ColumnElement.label()
构造来控制单个列表达式的名称,它可以从任何ColumnElement
派生的对象中获得,也可以从任何被映射到的类属性中获得(如User.name
)。
SQL>>> for row in session.query(User.name.label('name_label')).all():
... print(row.name_label)
ed
wendy
mary
fred
假设在对<