дублирование ent-go o2m upsert
Я пытаюсь обновить таблицу A с отношениями к таблице B, а также обновить через структуру ent-go с Postgres.
CmdbCiServerVmwareVirtualMachine:
+----------------+--------------------------------+--------+----------+----------+---------+---------------+-----------+---------------------------------+------------+---------+
| Field | Type | Unique | Optional | Nillable | Default | UpdateDefault | Immutable | StructTag | Validators | Comment |
+----------------+--------------------------------+--------+----------+----------+---------+---------------+-----------+---------------------------------+------------+---------+
| id | uuid.UUID | false | false | false | true | false | false | json:"id,omitempty" | 0 | |
| created_at | time.Time | false | false | false | true | false | true | json:"created_at,omitempty" | 0 | |
| updated_at | time.Time | false | false | false | true | true | false | json:"updated_at,omitempty" | 0 | |
| deleted_at | time.Time | false | true | false | false | true | false | json:"deleted_at,omitempty" | 0 | |
| sysId | uuid.UUID | true | false | false | false | false | false | json:"sysId,omitempty" | 0 | |
| name | string | false | true | false | false | false | false | json:"name,omitempty" | 0 | |
| vCpu | int | false | true | false | false | false | false | json:"vCpu,omitempty" | 0 | |
| coresPerSocket | int | false | true | false | false | false | false | json:"coresPerSocket,omitempty" | 0 | |
| memory | int | false | true | false | false | false | false | json:"memory,omitempty" | 0 | |
| hwVersion | string | false | true | false | false | false | false | json:"hwVersion,omitempty" | 0 | |
| guestOS | string | false | true | false | false | false | false | json:"guestOS,omitempty" | 0 | |
| guestOSFamily | string | false | true | false | false | false | false | json:"guestOSFamily,omitempty" | 0 | |
| guestOSFqdn | string | false | true | false | false | false | false | json:"guestOSFqdn,omitempty" | 0 | |
| powerState | string | false | true | false | false | false | false | json:"powerState,omitempty" | 0 | |
| customFields | []struct { Key int | false | false | false | false | false | false | json:"customFields,omitempty" | 0 | |
| | "json:\"Key\""; Value string | | | | | | | | | |
| | "json:\"Value\"" } | | | | | | | | | |
| data | vmware.VCenterVirtualMachine | false | true | false | false | false | false | json:"data,omitempty" | 0 | |
+----------------+--------------------------------+--------+----------+----------+---------+---------------+-----------+---------------------------------+------------+---------+
+--------+---------------------------------------------+---------+---------+----------+--------+----------+---------+
| Edge | Type | Inverse | BackRef | Relation | Unique | Optional | Comment |
+--------+---------------------------------------------+---------+---------+----------+--------+----------+---------+
| fields | CmdbCiServerVmwareVirtualMachineCustomField | false | | O2M | false | true | |
+--------+---------------------------------------------+---------+---------+----------+--------+----------+---------+
CmdbCiServerVmwareVirtualMachineCustomField:
+------------+-----------+--------+----------+----------+---------+---------------+-----------+-----------------------------+------------+---------+
| Field | Type | Unique | Optional | Nillable | Default | UpdateDefault | Immutable | StructTag | Validators | Comment |
+------------+-----------+--------+----------+----------+---------+---------------+-----------+-----------------------------+------------+---------+
| id | uuid.UUID | false | false | false | true | false | false | json:"id,omitempty" | 0 | |
| created_at | time.Time | false | false | false | true | false | true | json:"created_at,omitempty" | 0 | |
| updated_at | time.Time | false | false | false | true | true | false | json:"updated_at,omitempty" | 0 | |
| deleted_at | time.Time | false | true | false | false | true | false | json:"deleted_at,omitempty" | 0 | |
| sysId | uuid.UUID | false | false | false | false | false | false | json:"sysId,omitempty" | 0 | |
| key | int | false | false | false | false | false | false | json:"key,omitempty" | 0 | |
| value | string | false | true | false | false | false | false | json:"value,omitempty" | 0 | |
+------------+-----------+--------+----------+----------+---------+---------------+-----------+-----------------------------+------------+---------+
+----------------+----------------------------------+---------+---------+----------+--------+----------+---------+
| Edge | Type | Inverse | BackRef | Relation | Unique | Optional | Comment |
+----------------+----------------------------------+---------+---------+----------+--------+----------+---------+
| virtualMachine | CmdbCiServerVmwareVirtualMachine | true | fields | M2O | true | true | |
+----------------+----------------------------------+---------+---------+----------+--------+----------+---------+
Как видите, у меня есть Edge, и мой индекс уникален для sys_id и ключа в таблице полей.
// Indexes of the CmdbCiServerVmwareVirtualMachineCustomField.
func (CmdbCiServerVmwareVirtualMachineCustomField) Indexes() []ent.Index {
return []ent.Index{
index.Fields("key", "sysId").
Edges("virtualMachine").Unique(),
}
}
Следующий код, кажется, создает строки/отношения в порядке, однако он не будет обновлен при втором запуске - только дублируется и дает запись NULL в столбце отношений.
Я использую следующий код: