The pg_sequencer gem adds methods to your migrations to allow you to create, drop and change sequence objects in PostgreSQL. It also dumps sequences to schema.rb by extending ActiveRecord::SchemaDumper.
Requires ruby version 2.3+.
Add this to your Gemfile:
gem 'pg_sequencer'
pg_sequencer adds the following methods to migrations:
create_sequence(sequence_name, options)
change_sequence(sequence_name, options)
drop_sequence(sequence_name)
The methods closely mimic the syntax of the PostgreSQL for CREATE SEQUENCE, DROP SEQUENCE and ALTER SEQUENCE. See the References section below for more information.
For create_sequence and change_sequence, all options are the same, except create_sequence will look for :start or :start_with, and
change_sequence will look for :restart or :restart_with.
:increment/:increment_by(integer) - The value to increment the sequence by.:min(integer/false) - The minimum value of the sequence. If specified as false (e.g. :min => false), "NO MINVALUE" is sent to Postgres.:max(integer/false) - The maximum value of the sequence. May be specified as ":max => false" to generate "NO MAXVALUE":start/:start_with(integer) - The starting value of the sequence (create_sequence only):restart/:restart_with(integer) The value to restart the sequence with (change_sequence only):cache(integer) - The number of values the sequence should cache.:cycle(boolean) - Whether the sequence should cycle. Generated at "CYCLE" or "NO CYCLE"
Create a sequence called user_seq, incrementing by 1, min of 1, max of 2000000, starts at 1, caches 10 values, and disallows cycles:
create_sequence "user_seq",
increment: 1,
min: 1,
max: 2000000,
start: 1,
cache: 10,
cycle: false
This is equivalent to:
CREATE SEQUENCE user_seq INCREMENT BY 1 MIN 1 MAX 2000000 START 1 CACHE 10 NO CYCLE
change_sequence "accounts_seq", restart_with: 50
This is equivalent to:
ALTER SEQUENCE accounts_seq RESTART WITH 50
drop_sequence "products_seq"
This is equivalent to:
DROP SEQUENCE products_seq
- Tested with postgres 9.0.4, should work down to 8.1.
- Listing all the sequences in a database creates n+1 queries (1 to get the names and n to describe each sequence). Is there a way to fully describe all sequences in a database in one query?
- The "SET SCHEMA" fragment of the ALTER command is not implemented.
- Oracle/other databases not supported
- http://www.postgresql.org/docs/9.6/static/sql-createsequence.html
- http://www.postgresql.org/docs/9.6/static/sql-altersequence.html
- http://www.alberton.info/postgresql_meta_info.html
The original version of this gem was written by Tony Collen from Code42.
The design of pg_sequencer is heavily influenced by Matthew Higgins' foreigner
gem: https://github.com/matthuhiggins/foreigner