Change from SQLite to PostgreSQL in a fresh Rails project Change from SQLite to PostgreSQL in a fresh Rails project heroku heroku

Change from SQLite to PostgreSQL in a fresh Rails project


You can change your database.yml to this instead of using the out of the box sqlite one:

development:  adapter: postgresql  encoding: utf8  database: project_development  pool: 5  username:   password:test: &TEST  adapter: postgresql  encoding: utf8  database: project_test  pool: 5  username:   password:production:  adapter: postgresql  encoding: utf8  database: project_production  pool: 5  username:   password:cucumber:  <<: *TEST


The steps below worked for me. It uses the taps gem, created by Heroku and mentioned in Ryan Bates's Railscast #342. There are a few steps but it worked perfectly (even dates were correctly migrated), and it was far easier than the Oracle -> DB2 or SQL Server -> Oracle migrations I have done in the past.

Note that SQLite does not have a user id or password, but the taps gem requires something. I just used the literals "user" and "password".

Create the Postgres database user for the new databases

$ createuser f3Shall the new role be a superuser? (y/n) nShall the new role be allowed to create databases? (y/n) yShall the new role be allowed to create more new roles? (y/n) y

EDIT - Updated command below - use this instead

$ createuser f3 -d -s

Create the required databases

$ createdb -Of3 -Eutf8 f3_development$ createdb -Of3 -Eutf8 f3_test

Update the Gemfile

gem 'sqlite3'gem 'pg'gem 'taps'$ bundle

Update database.yml

#development:#  adapter: sqlite3#  database: db/development.sqlite3#  pool: 5#  timeout: 5000development:  adapter: postgresql  encoding: unicode  database: f3_development  pool: 5  username: f3  password:#test:#  adapter: sqlite3#  database: db/test.sqlite3#  pool: 5#  timeout: 5000test:  adapter: postgresql  encoding: unicode  database: f3_test  pool: 5  username: f3  password:

Start the taps server on the sqlite database

$ taps server sqlite://db/development.sqlite3 user password

Migrate the data

$ taps pull postgres://f3@localhost/f3_development http://user:password@localhost:5000

Restart the Rails webserver

$ rails s

Cleanup the Gemfile

#gem 'sqlite3'gem 'pg'#gem 'taps'$ bundle


Now its become easy with the single command

bin/rails db:system:change --to=postgresql