sql >> データベース >  >> RDS >> PostgreSQL

odooにMany2manyフィールドを追加した後、リレーションはすでに存在します

    私はこれを理解しました。言わなければならないのは、これは技術的にはOdooのバグと見なされると思います。

    概要

    モデルの名前が長すぎました。 _nameを設定するたびに この問題が発生する可能性があるために設定している16文字を超えるプロパティ。

    詳細

    Many2manyを作成するとき リレーション、odooは、このリレーション用に新しいデータベーステーブルを設定し、テーブル用に2つのデータベースインデックスを作成します。それらの名前は次のとおりです。

    • <model1>_<model2>_rel_<model1>_id_index
    • <model1>_<model2>_rel_<model2>_id_index

    <model1>の場所 および<model2> _nameです 適切なモデルのプロパティ。これは_m2m_raise_or_create_relationで確認できます。 odooのBaseModelのメソッド 。

    ただし、1つの問題があります。デフォルトでは、PostgreSQLのインデックス(インデックス識別子を含む)63文字を超えることはできません

    Odooはこれを考慮していません。幸いにもはるかに長い識別子が生成され、PostgreSQLによって切り捨てられます。両方の識別子が同じ最初の63文字を共有している場合(長い識別子の場合は非常に可能性が高い)、PostgreSQLでは同じものとして扱われます。つまり、最初のインデックスが作成されますが、2番目のインデックスを作成すると、すでに使用されている識別子を共有しているため、エラーが発生します(少なくともPostgreSQLによると)。

    したがって、_nameの最大長はどれくらいですか プロパティは、問題を回避しながら持つことができますか? m2m関係にある2つのモデルの名前間で共有される文字数によって異なりますが、識別子の切り捨てを完全に回避するには、16文字を超える名前を使用しないでください。

    なぜ16? PostgreSQL識別子は63文字を超えることはできません。 odooによって生成されたインデックス識別子には15個の固定文字があります。これで48文字が残り、モデル名の3回の繰り返しに対応する必要があります。これにより、単一のモデル名ごとに16文字が残ります。

    この問題を回避するもう1つの方法は、relationを使用して短いリレーション名を手動で設定することです。 Many2manyの属性 フィールド。



    1. ORACLE SQL:2つの数値の間のすべての整数を取得します

    2. 単一のMySQLデータベースへのリモートアクセスを許可する方法

    3. 生成されたキーを返すjOOQ挿入クエリ

    4. 列をnullにすることはできませんMysql