- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我定义了以下两个 odoo ORM 模型:
class Weekday(models.Model):
_name = 'ludwik.offers.weekday'
name = fields.Char()
class Duration(models.Model):
_name = 'ludwik.offers.duration'
weekday = fields.Many2many('ludwik.offers.weekday')
当我尝试启动 odoo 时,我收到以下消息:
ProgrammingError: relation "ludwik_offers_duration_ludwik_offers_weekday_rel_ludwik_offers_" already exists
此外,当我更改模型中的 _name
属性时,问题仍然存在(当然,错误消息中的关系名称会更改以反射(reflect)重命名),所以这不仅仅是与冲突一些旧的关系已经存在于数据库中。
最佳答案
我想通了。我不得不说,我认为这在技术上属于 Odoo 中的错误。
总结
我的模型名称太长。每次你设置一个_name
属性超过 16 个字符,您设置自己可能会遇到此问题。
详情
当您创建 Many2many
关系,odoo 为这个关系建立一个新的数据库表,然后为该表创建两个数据库索引。他们的名字如下:
<model1>_<model2>_rel_<model1>_id_index
<model1>_<model2>_rel_<model2>_id_index
在哪里<model1>
和 <model2>
是 _name
适当模型的属性。您可以在 _m2m_raise_or_create_relation
中观察到这一点odoo的方法BaseModel
.
但是有一个问题。默认情况下,PostgreSQL 中的标识符(包括索引标识符)can not be longer than 63 characters :
The system uses no more than NAMEDATALEN-1 bytes of an identifier; longer names can be written in commands, but they will be truncated. By default, NAMEDATALEN is 64 so the maximum identifier length is 63 bytes.
Odoo 不考虑这一点。它很乐意生成更长的标识符,然后被 PostgreSQL 截断。如果两个标识符共享相同的前 63 个字符(对于更长的标识符很可能),它们将被 PostgreSQL 视为相同。这意味着将创建第一个索引,但创建第二个索引将导致错误,因为它共享一个已被使用的标识符(至少根据 PostgreSQL)。
那么_name
的最大长度是多少?属性可以有同时避免的问题吗?这取决于 m2m 关系中两个模型的名称之间共享的字符数,但要完全避免标识符截断,您不应使用超过 16 个字符的名称。
为什么是 16? PostgreSQL 标识符不能超过 63 个字符。在 odoo 生成的索引标识符中,有 15 个固定字符。这给我们留下了 48 个字符,这些字符必须容纳三个重复的模型名称。这反过来又给我们留下了每个模型名称 16 个字符。
解决此问题的另一种方法是通过 relation
手动设置一个简短的关系名称Many2many
上的属性字段。
关于python - "relation already exists"在 odoo 中添加 Many2many 字段后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26062915/
我在 SQL 查询中使用了一个简单的 IF NOT EXISTS/WHERE NOT EXISTS 语句(我都尝试过),但我总是收到 mysql 错误,不知道为什么。尝试使用不同的引号,检查我的 My
我有 2 个表:tbl1 和 tbl2。我想从 tbl1 返回一行,其中包含以下列:col1、col2、col3、can_be_deleted 、有重要项目。这个想法是,can_be_deleted
如果您是 "t1".persona_1_id = 2,则预期结果应返回 persona_id = 4。 like --- id persona_1_id persona_2_id liked 1 2
我遇到了这个用于执行幂等插入的 github SQL 代码示例。完全按照我想要的方式工作。我不想使用 EXISTS,因为我觉得它有点困惑。可以使用联接对相同的操作进行编码吗? 下面是我在 github
public bool CheckTblExist(string TblName) { try { string cmTxt = "s
表1 Id Name DemoID 1 a 33 2 b 44 3 c 33 4 d 33 5 e 44 表2 Id DemoID IsT
我对 SQL 非常陌生。我想知道当我使用“IF EXISTS”或“IF NOT EXISTS”时会发生什么。例如:以下两个语句有什么区别: 语句 1:(存在) IF EXISTS( SELECT OR
我正在更新 exist-db 集合中的 XML 文件,我必须检查是否存在 id 以决定是否必须在我的文档中替换或插入某些内容。 我注意到随着文件的增长,查询执行时间显着恶化,我决定为我的文件添加一个索
我有一个正在尝试更新的数据库,但我不明白为什么会收到有关不存在的列的奇怪错误。当我使用“heroku pg:psql”访问数据库时,我完全可以看到该列。我找到了couple其他questions遇到类
我有一个这样的查询 SELECT ... FROM ... WHERE (SELECT EXISTS (SELECT...)) which did not return anything th
我有一个可以对数据库执行插入和更新的程序,我从 API 获取数据。这是我得到的示例数据: $uname = $get['userName']; $oname = $get['offerNa
我的批处理文件中有这个脚本 -- if not exist "%JAVA_HOME%" ( echo JAVA_HOME '%JAVA_HOME%' path doesn't exist) -
有没有办法让 Directory.Exists/File.Existssince 区分大小写 Directory.Exists(folderPath) 和 Directory.Exists(folde
考虑使用这两个表和以下查询: SELECT Product. * FROM Product WHERE EXISTS ( SELECT * FROM Codes
我正在使用 Subclipse 1.6.18 使用 Eclipse 3.72 (Indigo) 来处理 SVN 1.6 存储库。这一切都在 Ubuntu 下运行。 我有一个项目,在我更新我的 Ecli
我正在尝试使用 Terraform 配置 Azure 存储帐户和文件共享: resource "random_pet" "prefix" {} provider "azurerm" { versi
我有兴趣为需要使用 NOT EXISTS 的应用程序编写查询。子句来检查一行是否存在。 我正在使用 Sybase,但我想知道一般 SQL 中是否有一个示例,您可以在其中编写具有 NOT EXISTS
我正在尝试使用 Terraform 配置 Azure 存储帐户和文件共享: resource "random_pet" "prefix" {} provider "azurerm" { versi
下面是代码示例: CREATE TABLE #titles( title_id varchar(20), title varchar(80)
我曾经这样编写 EXISTS 检查: IF EXISTS (SELECT * FROM TABLE WHERE Columns=@Filters) BEGIN UPDATE TABLE SET
我是一名优秀的程序员,十分优秀!