将 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_1
和 schema_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
我正在使用 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_1
和 schema_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