Odoo(Python) 中的顺序 SQL 更新和潜在冲突

问题描述 投票:0回答:1

标题:

身体: 我在 Odoo 模块中有代码,在

update
表上有两个连续的 SQL
gym_membership
语句。第一个将合格成员资格的状态更新为“已确认”,第二个将不同组的状态设置为“草稿”。我想澄清他们的执行和潜在冲突。

代码:

self.env.cr.execute("UPDATE gym_membership SET state = 'confirmed' WHERE id IN (SELECT gym_membership_id FROM sale_order WHERE gym_membership_id IN (SELECT id FROM gym_membership WHERE state = 'finished' AND is_sessions_generated = False AND membership_type IN ('class','private')))")
self.env.cr.execute("UPDATE gym_membership SET state = 'draft' WHERE state = 'finished' AND is_sessions_generated = False AND membership_type IN ('class','private')")

澄清:

  1. 这些 SQL 查询将如何在 Odoo 中顺序执行。
  2. 第一个和第二个查询的更新之间存在潜在冲突。
  3. 在 Odoo 中执行顺序 SQL 操作的最佳实践。
python sql mysql postgresql odoo
1个回答
1
投票
  1. 这些 SQL 查询将如何在 Odoo 中顺序执行。

在您的示例中它是相同的光标,因此将执行第一个查询,然后执行下一个查询,依此类推。已经是连续的了

  1. 第一个和第二个查询的更新之间存在潜在冲突。

因为是同一个游标,所以不应该发生冲突,因为第二个查询的数据状态已经是第一个查询之后的状态。因此,第二个查询可能会更新第一个查询已经更新的数据,但这就是顺序执行查询的方式。

  1. 在 Odoo 中执行顺序 SQL 操作的最佳实践。

尽可能避免 SQL 查询,因为您完全绕过了 Odoo 的安全功能。通常只有 Odoo 生成的非常糟糕的查询才应该使用它们进行优化,即使如此,也只能在尝试优化表本身之后(例如通过特殊的索引)。

  1. 在这种情况下如何避免 SQL 查询

尽可能使用 ORM。举个例子:

# first query in ORM
sale_domain = [
    ("gym_membership_id.state", "=", "finished"),
    ("gym_membership_id.is_sessions_generated", "=", False),
    ("gym_membership_id.membership_type", "in", ("class", "private")),
]
memberships_sale = self.env["sale.order"].search(sale_domain).mapped("gym_membership_id")
memberships_sale.write({"state": "confirmed"})

# second query in ORM
membership_domain = [
    ("state", "=", "finished"),
    ("is_sessions_generated", "=", False),
    ("membership_type", "in", ("class", "private")),
]
memberships = self.env["gym.membership"].search(membership_domain))
memberships.write({"state": "draft"})
© www.soinside.com 2019 - 2024. All rights reserved.