Конфликт дублирующих ключей при использовании 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