我使用activerecord-import gem在一个DB insert中导入多个记录,在同一个项目中我使用apartment gem创建和使用多个postgres模式,并在多个模式之间实时切换.
这个问题有时是在导入记录之后,会出现冲突的唯一记录ids!
ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR:重复键值违反唯一约束"table_name_“详细信息: key (id)=(43)已经存在。
此冲突仅通过使用活动记录导入宝石发生.
发布于 2017-11-13 12:28:43
在调试了许多案件之后..。我意识到,这个问题来自活动记录sequence_name后,切换模式公寓创业板。
假设我们有两个模式( schema_1和schema_2 ),在通过单元gem切换模式之后,它不会更改DB表的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做记录.而且它工作得很好!并从当前模式(schema_2)获取新的序列ids。
看起来.create和.save会自动刷新sequence_name,但是active-records-导入不会!
在使用sequence_name之前,我通过手动刷新.import来解决这个问题,方法是:
TableName.reset_sequence_namehttps://stackoverflow.com/questions/47264394
复制相似问题