将 activerecord-import 与公寓一起使用时出现重复键冲突 gem

duplicate keys conflict in using activerecord-import with apartment gem

我正在使用 activerecord-import gem 在一个数据库插入中导入多条记录,在同一项目中我正在使用 apartment gem 创建和使用多个 postgres 模式并在多个模式之间实时切换 ...

问题是有时导入记录后,唯一记录id会发生冲突!

ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "table_name_" DETAIL: Key (id)=(43) already exists.

此冲突仅通过使用活动记录导入发生 gem ...

在调试了很多案例后...我意识到问题出在活动记录 sequence_name 之后通过公寓切换模式 gem ..

假设我们有两个模式 schema_1schema_2,按公寓 gem 切换模式后,它不会更改数据库 [=44] 的 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 gem 之后,它从旧模式中获取序列 ID! (schema_1) ...可能是这个 id 已经在 schema_2 中使用过 ...并且将是 PG::UniqueViolation 错误 ...

我尝试通过 TableName.create.save 创建记录......并且它工作正常!并从当前模式中获取新的序列 ID (schema_2) ..

似乎 .create.save 会自动刷新 sequence_name 但 active-records-import 不会!

我通过在使用 .import 之前手动刷新 sequence_name 解决了这个问题,方法是:

TableName.reset_sequence_name