事务和底层SQL

来自Odoo大V社-odoo中文开发手册
Admin讨论 | 贡献2017年6月2日 (五) 18:26的版本 (创建页面,内容为“数据库写入操作是在数据库的上下文中执行的事务。通常情况下,我们不用担心服务器在运行模型方法时的问题。 但在某些...”)

(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航搜索

数据库写入操作是在数据库的上下文中执行的事务。通常情况下,我们不用担心服务器在运行模型方法时的问题。 但在某些情况下,我们可能需要更好地控制事务。这可以通过数据库游标self.env.cr完成,如下所示︰

 self.env.cr.commit()提交事务的缓冲写入操作  self.env.savepoint()设置一个事务回滚到保存点  self.env.rollback()取消事务最后一个保存点的写操作,因或者假设没有创建保存点

小提示

在shell会话中,除非使用self.env.cr.commit()否则你的数据操作不会使用。

使用游标execute()方法,我们可以直接在数据库中运行SQL。它使用带有SQL语句的字符串和第二个可选参数作为SQL的参数的一个元组或值列表。这些值将使用了%s占位符。

注意

小心 !

对于cr.execute(),我们应该拒绝直接将参数值添加到查询字符串。可以通过SQL加以利用注入攻击,这是众所周知的安全风险。通常使用%s占位符和第二个参数值。 如果您使用的是SELECT查询,那么应该获取记录。fetchall()函数检索所有的行,作为一个tupples的列表和dictfetchall()将它们作为一个字典列表检索,如下面的示例所示︰

>>> self.env.cr.execute("SELECT id, login FROM res_users WHERE
login=%s OR id=%s", ('demo', 1))
>>> self.env.cr.fetchall()
[(4, u'demo'), (1, u'admin')]
 

还可以运行数据操作语言(DML)指令像UPDATE和INSERT。由于服务器保存数据缓存,它们可能会与数据库中的实际数据不一致。正因为如此,在使用时原始的DML,应该在以后使用这些缓存self.env.invalidate_all()。

注意

小心 !

直接在数据库中执行SQL可能导致不一致的数据。只有你确信你要做什么事才使用它。