【SQLAlchemy】官方文档教程学习4:回滚和查询操作

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

假设在对<

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值