Ich habe eine Rails-App, die Datenbanken in SQLite (The dev und production) enthält. Da ich zu Heroku wechsle, möchte ich meine Datenbank in PostgreSQL umwandeln.
Wie auch immer, ich habe gehört, dass die lokale Entwicklungsdatenbank nicht von SQLite geändert werden muss. Ich muss das also nicht ändern. Wie kann ich jedoch die Produktionsumgebung von SQLite zu PostgreSQL ändern?
Hat jemand das schon mal gemacht und kann helfen?
P.S. Ich bin nicht sicher, wie genau dieser Prozess bezeichnet wird, aber ich habe gehört, dass die Datenbank von SQLite zu PostgreSQL migriert wird. Ist das zu tun?
Sie können Ihre database.yml in diese umwandeln, anstatt die Standardeinstellung von sqlite zu verwenden:
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
Die folgenden Schritte haben für mich funktioniert. Es verwendet das von Heroku erstellte taps gem, das in Ryan Bates 'Railscast # 342 erwähnt wird. Es gibt ein paar Schritte, aber es hat perfekt funktioniert (selbst Datumsangaben wurden korrekt migriert), und es war viel einfacher als die Oracle-> DB2- oder SQL Server-> Oracle-Migrationen, die ich in der Vergangenheit durchgeführt habe.
Beachten Sie, dass SQLite keine Benutzer-ID oder kein Kennwort hat, der Taps-Gem jedoch etwas erfordert. Ich habe nur die Literale "Benutzer" und "Passwort" verwendet.
Erstelle den Postgres-Datenbankbenutzer für die neuen Datenbanken
$ 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
EDIT - Der Befehl wurde unten aktualisiert - stattdessen wird dieser Befehl verwendet
$ createuser f3 -d -s
Erstellen Sie die erforderlichen Datenbanken
$ createdb -Of3 -Eutf8 f3_development
$ createdb -Of3 -Eutf8 f3_test
Aktualisiere das Gemfile
gem 'sqlite3'
gem 'pg'
gem 'taps'
$ bundle
update 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:
Starte den Taps-Server in der SQLite-Datenbank
$ taps server sqlite://db/development.sqlite3 user password
Daten migrieren
$ taps pull postgres://[email protected]/f3_development http://user:[email protected]:5000
Den Rails-Webserver neu starten
$ Rails s
Bereinigen der Gemfile
#gem 'sqlite3'
gem 'pg'
#gem 'taps'
$ bundle
Da Sie zum Heroku wechseln, können Sie dies durch Antippen tun:
heroku db:Push
Dadurch werden Ihre lokalen SQLite-Entwicklungsdaten in die Produktion übertragen, und Heroku wird für Sie automatisch in Postgres konvertiert.
Dies sollte auch funktionieren, um eine Produktions-SQLite-Db auf Heroku zu verschieben, aber es wurde nicht getestet.
Rails_ENV=production heroku db:Push
Aktualisieren Sie einfach die Datei 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:
Das obige ist, was beim Ausführen erzeugt wird:
$ Rails new projectname --database=postgresql --skip-test-unit
Fügen Sie dies auch Ihrem Gemfile hinzu:
gem 'pg'
sie müssen außerdem die Zeile " gem 'pg' " zu Ihrem gemfile hinzufügen, wobei 'pg' der aktuelle postgres gem für Rails ist.
Nach dem Ersetzen von gem 'sqlite3
durch gem pg
in der gemfile erhielt ich den sqlite3 error
, wenn ich auf Heroku master schiebe, weil ich vergessen habe, die aktualisierte gemfile zu übergeben. Einfach das folgende Problem lösen:
git add .
git commit -m 'heroku Push'
heroku create
git Push heroku master
Aktualisieren Sie einfach Ihre 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
Wir verwenden Rails und die grundlegenden Standards sollten wie DRY, Convention over Configuration usw. befolgt werden. In obigem Code wiederholen wir also nicht immer denselben Code.
Jetzt ist es mit dem Befehl einfach geworden
bin/Rails db:system:change --to=postgresql
wenn Sie Zweifel haben, können Sie hier nachschauen
https://github.com/Rails/rails/pull/34832
Es wurde über mir erwähnt, aber ich habe nicht genug Ruf als Lurker, um es zu bewerten. In der Hoffnung, etwas mehr Aufmerksamkeit für Rails-Neulinge zu ziehen, lesen Sie diese Antwort:
sie müssen auch die Zeile "gem 'pg" "in Ihr Gemfile einfügen, wobei" pg "das aktuelle Postgres-Juwel für Rails ist.
^^^ Dies ist ein Schlüsselelement zusätzlich zu der in der ausgewählten Antwort beschriebenen Datei database.yml, um Ihre Rails-App zu Postgres zu migrieren.
So habe ich mein Setup. Wenn Sie nur MRI und nicht Jruby verwenden, können Sie die Logik in den Adaptereinstellungen überspringen.
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
Eine mögliche Lösung (nicht für Heroku) ist die Verwendung von yaml.db von:
Heute hatte ich das gleiche Problem. Ich arbeite an Rails 4.2.8. Als Lösung wurde die pg gem-Version angegeben, in meinem Fall 0.18.4
.
Sie können folgendes versuchen: sqlite3 development.db .dump | psql dbname username
oder versuchen Sie es mit sqlitetopgscript: http://trac-hacks.org/browser/sqlitetopgscript/0.10/sqlite2pg