Конфликт дублирующих ключей при использовании activerecord-import с жемчужиной квартиры

Я использую activerecord-import гем, чтобы импортировать много записей в одной вставке БД, в том же проекте, который я использую apartment gem для создания и использования нескольких схем Postgres и переключения между многими схемами в реальном времени...

проблема иногда после импорта записей, будет конфликт в уникальных идентификаторах записей!

ActiveRecord:: RecordNotUnique: PG:: UniqueViolation: ОШИБКА: двойное значение ключа нарушает ограничение уникальности "table_name_" DETAIL: ключ (id)=(43) уже существует.

этот конфликт происходит только при использовании gem импорта active-record...

1 ответ

Решение

После отладки многих случаев... Я понял, что проблема исходит от активной записи sequence_name после переключения схемы на жемчужину квартиры.

скажем, у нас есть две схемы schema_1 а также schema_2, после переключения схемы на жемчужину квартиры она не меняет имя_последовательности таблицы БД!!, как показано ниже...

Apartment::Tenant.switch! :schema_1
TableName.sequence_name => "schema_1.table_names_id_seq"
Apartment::Tenant.switch! :schema_2
TableName.sequence_name => "schema_1.table_names_id_seq"

поэтому после перехода на schema_2 и используя active-record-import gem это берет идентификатор последовательности из старой схемы! (schema_1) ... и может быть этот идентификатор уже используется в schema_2 ... и будет PG::UniqueViolation ошибка...

Я пытался создать записи TableName.create или же .save... и это работает правильно! и получение новых идентификаторов последовательности из текущей схемы (schema_2) ..

это похоже на .create а также .save обновить sequence_name автоматически, но active-records-import нет!

Я решил это, освежив sequence_name вручную перед использованием .import, от:

TableName.reset_sequence_name
Другие вопросы по тегам