discourse/lib/freedom_patches/seed_fu.rb
David Taylor ed688bec8c
FIX: Ensure id sequences are not reset during db:migrate (#14184)
The seed-fu gem resets the sequence on all the tables it touches. In some situations, this can cause primary keys to be re-used. This commit introduces a freedom patch which ensures seed-fu only touches the sequence when it is less than the id of one of the seeded records.
2021-08-30 12:31:22 +01:00

20 lines
630 B
Ruby

# frozen_string_literal: true
SeedFu::Seeder.prepend(Module.new do
def update_id_sequence
max_seeded_id = @data.filter_map { |d| d["id"] }.max
seq = @model_class.connection.execute(<<~SQL)
SELECT last_value
FROM #{@model_class.sequence_name}
SQL
last_seq_value = seq.first["last_value"]
if max_seeded_id && last_seq_value < max_seeded_id
# Update the sequence to start from the highest existing id
@model_class.connection.reset_pk_sequence!(@model_class.table_name)
else
# The sequence is already higher than any of our seeded ids - better not touch it
end
end
end)