python-3.x - 如何更新不可更新的视图?
问题描述
我正在开发 odoo version11。我创建了一个名为 test 的视图。我升级了模块。稍后我需要进行一些更改,包括更改一些值和删除一些值。每当我尝试升级模块时,我都会收到错误
psycopg2.OperationalError:无法从视图“测试”中删除详细信息:包含 GROUP BY 的视图不会自动更新。提示:要启用从视图中删除,请提供 INSTEAD OF DELETE 触发器或无条件 ON DELETE DO INSTEAD 规则。
如何提供规则?我的代码如下
@api.model_cr
def init(self):
cr = self.env.cr
tools.drop_view_if_exists(cr, 'o_test')
cr.execute("""
CREATE or replace view o_test as
(
SELECT
mve.id as id,
acc.code as account_code,
SUM (mve.debit-mve.credit) AS balance,
mve.account_id as account_id
FROM account_move_line mve
LEFT JOIN account_account acc ON mve.account_id = acc.id
GROUP BY mve.id,mve.account_id,acc.code
)
""")
我想将代码更改如下:
@api.model_cr
def init(self):
cr = self.env.cr
tools.drop_view_if_exists(cr, 'o_test')
cr.execute("""
CREATE or replace view o_test as
(
SELECT
mve.account_id as id,
acc.code as account_code,
SUM (mve.debit-mve.credit) AS balance,
mve.account_id as account_id
FROM account_move_line mve
LEFT JOIN account_account acc ON mve.account_id = acc.id
GROUP BY mve.account_id,acc.code
)
""")
解决方案
可以使用规则在 Postgres 中创建可编辑视图,并且 GROUP BY 子句应该不是问题。您可以为更新查询编写如下规则。这里我只更新了一栏
CREATE OR REPLACE RULE update_o_test AS
ON UPDATE TO o_test
DO INSTEAD
UPDATE account_account SET code = new.code
WHERE account_account.id = old.id;
同样,您可以为插入和删除操作创建规则。在创建视图语句结束后添加规则应该可以工作。希望这可以帮助...
推荐阅读
- python - 无论我输入字符串还是整数,如何更改此代码以获得结果?
- sed - SED 用新字符串替换被空格包围的字符串
- ios - 无法在 Swift 中找到正确的 iOS DateFormatter
- linux - 容器和主机的时差问题
- reactjs - 为什么在从事件处理程序分配状态时需要设置组件的值?
- javascript - 从服务器读取另一台机器的文件
- c# - 跨平台 C# 加密:无法生成正确的密钥/选择正确的算法
- go - 无法通过远程 ssh 命令在远程服务器上构建 go 程序
- sql - 连接来自多列和多行的字符串
- c# - 使用 WinForms 控件中的 SystemEvents 为具有静态方法的类处理模式