新しいRailsプロジェクトでSQLiteからPostgreSQLに変更する


125

データベースがSQLite(開発とプロダクション)にあるRailsアプリがあります。herokuに移動するので、データベースをPostgreSQLに変換したいと考えています。

とにかく、ローカルの開発用データベースをSQLiteから変更する必要がないと聞いたので、変更する必要はありませんが、本番環境をSQLiteからPostgreSQLに変更するにはどうすればよいですか?

誰かこれまでにこれを行ったことがありますか?

PSこのプロセスが正確に何と呼ばれるかはわかりませんが、SQLiteからPostgreSQLへのデータベースの移行について聞いたことがあります。


2
一緒に使用する必要があるライブの本番データはありますか、それとも新規/新規アプリですか?
ディランマルコウ2011

19
開発環境もPostgreSQLに変更することをお勧めします。SQLiteとPostgreSQL(および他のすべてのデータベース)は、「有効なSQL」の意味について異なる考えを持っており、ORMはデータベースのすべての特異性からユーザーを隔離することはできません。
muが短すぎる

回答:


101

既成のsqliteを使用する代わりに、database.ymlを次のように変更できます。

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

1
project_testまたはデータベースの名前を入力する必要がありますか?
Vasseurth、2011

5
好きな名前を付けることができます。プロジェクト名が「電卓」である場合、それらに名前を付けます。calculator_production、calculator_test、calculator_development
Chris Barretto

2
@mmichaelそれは本当にあなたのpostgresの設定方法に依存します。MacOS X Lion +を使用している場合にpostgres.app、brew、またはnativeを使用すると、デフォルトのセットアップに異なる制限があります。したがって、ユーザー名とパスワードが適用されない場合は、値を指定せずにそのままにするか、そのままにすることができます。これは、「キャッチオール」タイプの構成にすぎません。
Chris Barretto 2013年

2
ここで「&TEST」は何をしていますか(9行目)?
David Rhoden 2013

2
「&TEST」は、TESTをデフォルトのオプションセットとして設定しています。これらは後でオーバーライドすることも、除外することもできます。"<<:* TEST"は、デフォルトの@DavidRhodenにアクセスする方法です
Chris Barretto

44

以下の手順でうまくいきました。Herokuによって作成され、Ryan BatesのRailscast#342で言及されているタップの宝石を使用しています。いくつかの手順がありますが、完全に機能し(日付も正しく移行されました)、Oracle-> DB2またはSQL Server->以前に行ったOracleの移行よりもはるかに簡単でした。

SQLiteにはユーザーIDまたはパスワードはありませんが、タップの宝石には何かが必要です。私はリテラル「ユーザー」と「パスワード」を使用しました。

新しいデータベースのPostgresデータベースユーザーを作成する

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

編集-以下の更新されたコマンド-代わりにこれを使用してください

$ createuser f3 -d -s

必要なデータベースを作成する

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

Gemfileを更新する

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

database.ymlを更新する

#development:
#  adapter: sqlite3
#  database: db/development.sqlite3
#  pool: 5
#  timeout: 5000

development:
  adapter: postgresql
  encoding: unicode
  database: f3_development
  pool: 5
  username: f3
  password:

#test:
#  adapter: sqlite3
#  database: db/test.sqlite3
#  pool: 5
#  timeout: 5000

test:
  adapter: postgresql
  encoding: unicode
  database: f3_test
  pool: 5
  username: f3
  password:

sqliteデータベースでタップサーバーを起動します

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

データを移行する

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

Railsウェブサーバーを再起動します。

$ rails s

Gemfileをクリーンアップする

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

10

herokuに移動しているので、タップを使用してこれを行うことができます。

heroku db:push

これにより、ローカル開発のsqliteデータが本番環境にプッシュされ、herokuが自動的にpostgresに変換します。

これは、プロダクションsqlite dbをherokuにプッシュするためにも機能するはずですが、テストされていません。

RAILS_ENV=production heroku db:push

1
私はそれがmindblowinglyスムーズだったことをやったら-宝石は、あなたがそれを実行するために取得するには、ローカルに1.9.2をインストールする必要があるかもしれません、1.9.3でうまく動作するようには思えないタップgithub.com/ricardochimal/taps/issues/93
スビーム

これはもう不可能です。詳細については、この質問を参照してください:stackoverflow.com/questions/19817851/…–
sykaeh

5

また、行「gem 'pg'」をgemfile に追加する必要があります。「pg」はRailsの現在のpostgres gemです。


5

config / database.ymlファイルを更新するだけです:

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5

development:
  <<: *default
  database: projectname_development

test:
  <<: *default
  database: projectname_test

production:
  <<: *default
  database: projectname_production
  username: 
  password: 

上記は実行時に生成されるものです:

$ rails new projectname --database=postgresql --skip-test-unit

また、これをGemfileに追加します。

gem 'pg'

5

今、それは単一のコマンドで簡単になります

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

1
これは素晴らしい答えです。必要な値でdatabase.ymlを変更します。そこに行って、プロジェクトに応じてデータベース名を変更することができます。
csalmeida

3

gemfileでgem 'sqlite3をgem pgに置き換えた後sqlite3 error、更新されたgemfileをコミットするのを忘れたため、Herokuマスターにプッシュするときにを取得し続けました。以下を実行するだけでこれが解決しました:

git add .
git commit -m 'heroku push'
heroku create 
git push heroku master

3

datatbase.ymlを更新するだけです

development: &development
  adapter: postgresql
  database: Your_database_name
  username: user_name
  password: password
  host:     localhost
  schema_search_path: public
  min_messages: warning

test:
  <<: *development
  database: test_database_name

production:
  <<: *development
  database: production_db_name

レールを使用しており、DRY、Convention over Configurationなどの基本的な標準に従う必要があります。そのため、上記のコードでは、同じコードを何度も繰り返していません。


2

それは私の上で言及されましたが、私はそれを賛成することができるほどの潜伏者としての評判が十分ではありません。この回答を読んでいるRailsの初心者にもう少し注意を引くことを期待して:

また、行「gem 'pg'」をgemfileに追加する必要があります。「pg」はRailsの現在のpostgres gemです。

^^^これは、選択した回答に記載されているdatabase.ymlファイルに加えて、RailsアプリをPostgresに移行するための重要な要素です。


1

これが私の設定です。JrubyではなくMRIのみを使用している場合は、アダプター設定のロジックをスキップできます。

defaults: &defaults
  adapter: <%= RUBY_ENGINE == 'ruby' ? 'postgresql' : 'jdbcpostgresql' %>
  encoding: unicode
  pool: 5
  timeout: 5000

development:
  database: project_development
  <<: *defaults

test:
  database: project_test
  <<: *defaults

production:
  database: project_production
  <<: *defaults

0

以下を試すことができます: sqlite3 development.db .dump | psql dbname username

またはsqlitetopgscriptで試してください:http ://trac-hacks.org/browser/sqlitetopgscript/0.10/sqlite2pg



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.