“事务和底层SQL”的版本间的差异
来自Odoo大V社-odoo中文开发手册
(创建页面,内容为“数据库写入操作是在数据库的上下文中执行的事务。通常情况下,我们不用担心服务器在运行模型方法时的问题。 但在某些...”) |
|||
第32行: | 第32行: | ||
直接在数据库中执行SQL可能导致不一致的数据。只有你确信你要做什么事才使用它。 | 直接在数据库中执行SQL可能导致不一致的数据。只有你确信你要做什么事才使用它。 | ||
+ | |||
+ | 上一节:[[修改执行环境]] 下一节:[[使用记录集]] |
2017年12月26日 (二) 08:40的最新版本
数据库写入操作是在数据库的上下文中执行的事务。通常情况下,我们不用担心服务器在运行模型方法时的问题。 但在某些情况下,我们可能需要更好地控制事务。这可以通过数据库游标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可能导致不一致的数据。只有你确信你要做什么事才使用它。