# PgHaMigrations PgHaMigrations is a gem that applies learned best practices to ActiveRecord Migrations. Provided functionality: - [Migrations](#migrations) - [Utilities](#utilities) - [Rake Tasks](#rake-tasks) ## Installation Add this line to your application's Gemfile: ```ruby gem 'pg_ha_migrations' ``` And then execute: $ bundle Or install it yourself as: $ gem install pg_ha_migrations ## Usage ### Migrations In general, existing migrations are prefixed with `unsafe_` and safer alternatives are provided prefixed with `safe_`. Migrations prefixed with `unsafe_` will warn when invoked. The API is designed to be explicit yet remain flexible. There may be situations where invoking the unsafe migration is preferred. Migrations prefixed with `safe_` prefer concurrent operations where available, set low lock timeouts where appropriate, and decompose operations into multiple safe steps. The following functionality is currently unsupported: - Rollbacks - Generators - schema.rb #### safe\_create\_table Safely creates a new table. ```ruby safe_create_table :table do |t| t.type :column end ``` #### safe\_create\_enum\_type Safely create a new enum without values. ```ruby safe_create_enum_type :enum ``` Or, safely create the enum with values. ```ruby safe_create_enum_type :enum, ["value1", "value2"] ``` #### safe\_add\_enum\_value Safely add a new enum value. ```ruby safe_add_enum_value :enum, "value" ``` #### safe\_add\_column Safely add a column. ```ruby safe_add_column :table, :column, :type ``` #### unsafe\_add\_column Unsafely add a column, but do so with a lock that is safely acquired. ```ruby unsafe_add_column :table, :column, :type ``` #### safe\_change\_column\_default Safely change the default value for a column. ```ruby safe_change_column_default :table, :column, "value" ``` #### safe\_make\_column\_nullable Safely make the column nullable. ```ruby safe_make_column_nullable :table, :column ``` #### unsafe\_make\_column\_not\_nullable Unsafely make a column not nullable. ```ruby unsafe_make_column_not_nullable :table, :column ``` #### safe\_add\_concurrent\_index Add an index concurrently. Migrations that contain this statement must also include `disable_ddl_transaction!`. ```ruby safe_add_concurrent_index :table, :column ``` Add a composite btree index. ```ruby safe_add_concurrent_index :table, [:column1, :column2], name: "index_name", using: :btree ``` #### safe\_remove\_concurrent\_index Safely remove an index. Migrations that contain this statement must also include `disable_ddl_transaction!`. ```ruby safe_remove_concurrent_index :table, :name => :index_name ``` ### Utilities #### safely\_acquire\_lock\_for\_table Safely acquire a lock for a table. ```ruby safely_acquire_lock_for_table(:table) do ... end ``` #### adjust\_lock\_timeout Adjust lock timeout. ```ruby adjust_lock_timeout(seconds) do ... end ``` #### adjust\_statement\_timeout Adjust statement timeout. ```ruby adjust_statement_timeout(seconds) do ... end ``` #### safe\_set\_maintenance\_work\_mem\_gb Set maintenance work mem. ```ruby safe_set_maintenance_work_mem_gb 1 ``` ### Rake Tasks Use this to check for blocking transactions before migrating. $ bundle exec rake pg_ha_migrations:check_blocking_database_transactions This rake task expects that you already have a connection open to your database. We suggest that you add another rake task to open the connection and then add that as a prerequisite for `pg_ha_migrations:check_blocking_database_transactions`. ```ruby namespace :db do desc "Establish a database connection" task :establish_connection do ActiveRecord::Base.establish_connection end end Rake::Task["pg_ha_migrations:check_blocking_database_transactions"].enhance ["db:establish_connection"] ``` ## Development After checking out the repo, run `bin/setup` to install dependencies and start a postgres docker container. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment. To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org). ## Contributing Bug reports and pull requests are welcome on GitHub at https://github.com/braintreeps/pg_ha_migrations. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct. ## License The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT). ## Code of Conduct Everyone interacting in the PgHaMigrations project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/braintreeps/pg_ha_migrations/blob/master/CODE_OF_CONDUCT.md).