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

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

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

ActiveRecord::RecordNotUnique: PG::UniqueViolation: ОШИБКА: повторяющееся значение ключа нарушает уникальное ограничение "table_name_" ПОДРОБНОСТИ: Ключ (id)=(43) уже существует.

этот конфликт происходит только при использовании гема импорта активной записи...


person Yaman ALTareh    schedule 13.11.2017    source источник


Ответы (1)


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

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

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 он берет идентификатор последовательности из старой схемы! (схема_1) ... и может быть этот идентификатор уже используется в схеме_2 ... и будет PG::UniqueViolation ошибка ...

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

похоже, что .create и .save обновляют имя_последовательности автоматически, но активный импорт-записей - нет!

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

TableName.reset_sequence_name
person Yaman ALTareh    schedule 13.11.2017