I am working with a Rails 4 application that needs to create a large number of objects in response to events from another system. I very often encounter errors ActiveRecord::RecordNotUnique(caused PG::UniqueViolation) in the primary key column when I call create!on one of my models.
I found other answers on SO that involve saving the exception and calling retry:
begin
TableName.create!(data: 'here')
rescue ActiveRecord::RecordNotUnique => e
if e.message.include? '_pkey'
log.warn "Retrying creation: #{e}"
retry
else
raise
end
end
Although this seems to help, I still get tons of errors ActiveRecord::RecordNotUniquefor sequential identifiers that already exist in the database (shortened log entries):
WARN -- Retrying creation: PG::UniqueViolation: DETAIL: Key (id)=(3067) already exists.
WARN -- Retrying creation: PG::UniqueViolation: DETAIL: Key (id)=(3068) already exists.
WARN -- Retrying creation: PG::UniqueViolation: DETAIL: Key (id)=(3069) already exists.
WARN -- Retrying creation: PG::UniqueViolation: DETAIL: Key (id)=(3070) already exists.
The identifiers that he is trying to use are in the range of 3000-4000, even if more than 90,000 entries are indicated in the table.
ActiveRecord PostgreSQL ?
(/ ):
{
"exception": "ActiveRecord::RecordNotUnique",
"message": "PG::UniqueViolation: ERROR: duplicate key value violates unique constraint \"table_name_pkey\"\nDETAIL: Key (id)=(3023) already exists."
}