Skip to content

Instantly share code, notes, and snippets.

@aalin
Created August 23, 2012 12:29
Show Gist options
  • Select an option

  • Save aalin/3436227 to your computer and use it in GitHub Desktop.

Select an option

Save aalin/3436227 to your computer and use it in GitHub Desktop.
Monkeypatching Rails SchemaDumper to support sequences.
class ActiveRecord::SchemaDumper
def dump(stream)
header(stream)
tables(stream)
sequences(stream)
sequence_defaults(stream)
trailer(stream)
stream
end
private
def sequences(stream)
sequences = @connection.select_values("SELECT c.relname FROM pg_class c WHERE c.relkind = 'S';")
sequences.each do |sequence|
next if sequence.match(/_id_seq$/) # Skip sequences for ids. Rails handles these automatically.
minval = @connection.select_value("SELECT min_value FROM #{ sequence };")
stream.puts format(' execute("CREATE SEQUENCE %s MINVALUE %d;")', sequence, minval)
end
end
# Rails doesn't understand functions in defaults, so we have to do this ourselves.
def sequence_defaults(stream)
sql =<<-SQL
SELECT
table_name, column_name, column_default
FROM
information_schema.columns
WHERE
column_default LIKE 'nextval(%' AND
column_name != 'id';
SQL
sequence_defaults = @connection.select_rows(sql)
sequence_defaults.each do |table, column, default|
stream.puts format(' execute("ALTER TABLE %s ALTER COLUMN %s SET DEFAULT %s;")', table, column, default)
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment