it-swarm.com.de

Wechseln Sie in einem neuen Rails-Projekt von SQLite zu PostgreSQL

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?

120
Vasseurth

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
98
Chris Barretto

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

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
9
Jesse Wolgamott

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'
5
jungledre

sie müssen außerdem die Zeile " gem 'pg' " zu Ihrem gemfile hinzufügen, wobei 'pg' der aktuelle postgres gem für Rails ist.

5
Gus Shortz

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
3
Zorak

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.

3
sunil

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
2
K ABHIRAM

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.

2
Justin Houk

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
1
ianks

Eine mögliche Lösung (nicht für Heroku) ist die Verwendung von yaml.db von:

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

0
F.Filippi

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

0
Vibhor Kumar