web-dev-qa-db-ja.com

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

データベースがSQLite(devとproduction)にあるRailsアプリがあります。私はherokuに移行しているので、データベースをPostgreSQLに変換したいと思います。

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

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

追伸このプロセスの正確な名前はわかりませんが、データベースをSQLiteからPostgreSQLに移行することを聞いたことがありますが、それは何をする必要があるのですか?

122
Vasseurth

すぐに使える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
98
Chris Barretto

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

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

新しいデータベースの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サーバーを起動

$ 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
43
ardochhigh

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

heroku db:Push

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

これは、本番sqlite dbをherokuにプッシュする場合にも機能するはずですが、テストされていません。

Rails_ENV=production heroku db:Push
9
Jesse Wolgamott

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
jungledre

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

5
Gus Shortz

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

git add .
git commit -m 'heroku Push'
heroku create 
git Push heroku master
3
Zorak

更新するだけで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

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

3
sunil

コマンドで簡単になりました

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

疑問がある場合はここで確認できます

https://github.com/Rails/rails/pull/34832
2
K ABHIRAM

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

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

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

2
Justin Houk

これが私のセットアップです。 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
1
ianks

可能な解決策(heroku用ではありません)では、yaml.dbを使用します:

http://www.railslodge.com/plugins/830-yaml-db

0
F.Filippi

今日、私は同じ問題を抱えていました。 Rails 4.2.8に取り組んでいます。解決策はpg gemバージョン(私の場合は0.18.4)を指定することでした。

あなたは次を試すことができます:sqlite3 development.db .dump | psql dbname username

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

0
Vibhor Kumar