Published on

Database Migrations

650 words4 min read
  • avatar
    Curtis Warcup

Database migrations are files that contain code that help progress our database schema forward. As you create new features, you will be needing to add new tables, columns, and other database objects. You will also need to remove tables, columns, and other database objects.

Migrations are a way to keep track of these changes and to make sure that all developers have the same database schema.

ActiveRecord comes with a built-in migration system that allows us to create and modify database tables and columns.

Creating a Migration

Inside of one of these migration files, we can write code that will modify our database schema.


class CreateProducts < ActiveRecord::Migration[6.1]
  def change
    create_table :products do |t|    # create a new table called `products`
      t.string :name                    # add a column called `name` of type `string`
      t.text :description
      t.string :image
      t.integer :price_cents
      t.integer :quantity

  • everything in the block is a column
    • this specifies all the columns that we want to add to our products table
  • id is not in here because it is automatically added by ActiveRecord

Running Migrations

  • we want to run a create database migration

Use the command:

bin/rake db:migrate

Tells Rails we want to run the migrations

Creating a Migration

Use Rails command line to create a migration:

bin/rails generate migration new_column_name


bin/rails generate migration add_user

This will create a new migration file in the db/migrate directory.

# db/migrate/20210824150000_add_user.rb
class AddUser < ActiveRecord::Migration[6.1]
  def change

We can now add new columns to our database:

# db/migrate/20210824150000_add_user.rb
class AddUser < ActiveRecord::Migration[6.1]
  def change
    add_column :products, :user_id, :integer

this example is adding a column called user_id to the products table

add_column(table_name, column_name, type, **options)

Then run the migration:

bin/rake db:migrate

This will run and update our database schema!

# db/schema.rb
ActiveRecord::Schema.define(version: 2021_08_24_150000) do

  create_table "products", force: :cascade do |t|
    t.string "name"
    t.text "description"
    t.string "image"
    t.integer "price_cents"
    t.integer "quantity"
    t.integer "user_id" # this is the new column
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false


Rolling Back Migrations

  • Maybe we made a mistake and want to undo a migration

This is where rollback comes in handy!

bin/rake db:rollback
  • This will undo the last migration that was run
    • you can run this multiple times to undo multiple migrations

Benefits of Migrations

  • Database changes become part of the code
  • ActiveRecord and Rails use Ruby code to modify the database
  • The history is kept in the db/migrate directory
  • makes changes easier
    • can push an update to the database schema to all developers
  • easy to deploy changes in production