Created
August 23, 2012 12:29
-
-
Save aalin/3436227 to your computer and use it in GitHub Desktop.
Monkeypatching Rails SchemaDumper to support sequences.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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