TipIf you are using PlanetScale with a Rails application, go to your database’s Settings page in the web app and enable
“Automatically copy migration data.” Select “Rails/Phoenix” as the migration framework. When enabled, this setting
updates the schema_migrations table each time you branch with the latest migration. If disabled, running
rake db:migrate will try to run all migrations every time, instead of only the latest one.
Introduction
In this tutorial, you’re going to learn how Rails migrations work with the PlanetScale branching and deployment workflows.NoteMigration tracking works with any migration tool, not just Rails. For other frameworks, specify the migration table name on your database’s Settings page.
Prerequisites
Follow the Connect a Rails app tutorial first. By the end, you will have:- Installed the PlanetScale CLI, Ruby, and the Rails gem
- Created a PlanetScale database named
blog
- Started a new Rails app named
blog
with a migration creating aUsers
table - Run the first Rails migration
A quick introduction to Rails migrations
Rails tracks an application’s migrations in an internal table calledschema_migrations
. At a high level, running rake db:migrate
does the following:
- Rails looks at all of the migration files in your
db/migrate
directory. - Rails queries the
schema_migrations
table to see which migrations have and haven’t been run. - Any migration that doesn’t appear in the
schema_migrations
table is considered pending and is executed by this task.
TipWhen you merge a deploy request in PlanetScale, the schema_migrations table in main is
automatically updated with the migration data from your branch.
Execute a Rails migration on PlanetScale
Rails migrations follow the PlanetScale non-blocking schema change workflow. First, the migration is applied to a development branch, and then the development branch is merged into themain
production branch with safe migrations enabled.
Let’s add another table to your existing blog
schema:
1
Create an When the branch is ready, you can verify that the Connect to the new branch:Query the migration table:
add-posts-table
development branch from main
in your database blog:schema_migrations
table is up-to-date with main
by checking for the timestamp of your Create Users
migration file. Your migration will have a different timestamp than the one shown here.Check the timestamp in your codebase:2
Connect your development environment to the new branch:One way to do this is to create a new password for the Then, update
add-posts-table
branch and update config/database.yml
with the new username, password, and host. Another is to use pscale connect
to establish a secure connection on a local port. Since the add-posts-table
branch won’t be needed after the migration, let’s use the pscale connect
proxy.In a separate terminal, establish the connection:config/database.yml
to connect through the proxy:3
Create the second Rails migration and call it Find the new migration file in
CreatePosts
:db/migrate
and add a few details for the new Posts table:4
Run the CreatePosts migration:This command runs the new migration against your
add-posts-table
development branch.At this point, Rails creates the posts
table and inserts another timestamp
into the schema_migrations
table on your development branch.You can verify the change in schema_migrations
yourself:5
Open a deploy request for your To create the deploy request, PlanetScale looks at the differences between the schemas of
add-posts-table
branch, and deploy your changes to main
.You can complete the deploy request either in the web app or with the pscale deploy-request
command.main
and add-posts-table
and plans a create table
statement to add the new table to main
. When you deploy, PlanetScale runs that create table
statement and copies the second row from schema_migrations
in add-posts-table
to the schema_migrations
table in main
.`6
Verify the changes in your
main
branch:In a pscale
shell for main
you can verify that the changes from add-posts-table
were deployed successfully.