データベースがSQLite(devとproduction)にあるRailsアプリがあります。私はherokuに移行しているので、データベースをPostgreSQLに変換したいと思います。
とにかく、ローカルの開発データベースをSQLiteから変更する必要はないと聞いたので、変更する必要はありませんが、実稼働環境をSQLiteからPostgreSQLに変更するにはどうすればよいですか?
これまでにこれをやったことがありますか?
追伸このプロセスの正確な名前はわかりませんが、データベースをSQLiteからPostgreSQLに移行することを聞いたことがありますが、それは何をする必要があるのですか?
すぐに使える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
以下の手順はうまくいきました。 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
Herokuに移動しているため、タップを使用してこれを行うことができます。
heroku db:Push
これにより、ローカルの開発sqliteデータが本番環境にプッシュされ、herokuが自動的にpostgresに変換します。
これは、本番sqlite dbをherokuにプッシュする場合にも機能するはずですが、テストされていません。
Rails_ENV=production heroku db:Push
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'
また、「gem 'pg'」という行をgemfileに追加する必要があります。「pg」は現在のRailsのpostgres gemです。
Gemfileでgem 'sqlite3
をgem pg
に置き換えた後、更新されたgemfileをコミットするのを忘れたため、Herokuマスターにプッシュするときにsqlite3 error
を取得し続けました。次のことを行うだけでこれが解決しました。
git add .
git commit -m 'heroku Push'
heroku create
git Push heroku master
更新するだけで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などの基本的な基準に従う必要があります。したがって、上記のコードでは、同じコードを何度も繰り返していません。
コマンドで簡単になりました
bin/Rails db:system:change --to=postgresql
疑問がある場合はここで確認できます
https://github.com/Rails/rails/pull/34832
それは私の上に言及されましたが、私はそれを支持することができる潜伏者として十分な評判を持っていません。この回答を読んでいるRails初心者にもう少し注意を引くことを期待して:
また、gemfileに「gem 'pg'」という行を追加する必要があります。「pg」は現在のRailsのpostgres gemです。
^^^これは、RailsアプリをPostgresに移行するために選択した回答で説明されているdatabase.ymlファイルに加えて重要な部分です。
これが私のセットアップです。 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
可能な解決策(heroku用ではありません)では、yaml.dbを使用します:
今日、私は同じ問題を抱えていました。 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