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

125

Ich habe eine Rails-App, deren Datenbanken sich in SQLite befinden (Entwickler und Produktion). Da ich zu Heroku wechsle, möchte ich meine Datenbank in PostgreSQL konvertieren.

Wie auch immer, ich habe gehört, dass die lokale Entwicklungsdatenbank nicht von SQLite geändert werden muss, also muss ich das nicht ändern. Wie gehe ich jedoch vor, um die Produktionsumgebung von SQLite auf PostgreSQL zu ändern?

Hat das schon mal jemand gemacht und kann helfen?

PS Ich bin mir nicht sicher, wie genau dieser Prozess heißt, aber ich habe von der Migration der Datenbank von SQLite nach PostgreSQL gehört. Muss das getan werden?

Vasseurth
quelle
2
Haben Sie Live-Produktionsdaten, die dazu passen, oder handelt es sich um eine neue / frische App?
Dylan Markow
19
Ich würde empfehlen, dass Sie auch Ihre Entwicklungsumgebung auf PostgreSQL ändern. SQLite und PostgreSQL (und jede andere Datenbank) haben unterschiedliche Vorstellungen darüber, was "gültiges SQL" bedeutet, und kein ORM kann Sie vor allen Besonderheiten der Datenbank schützen.
Mu ist zu kurz

Antworten:

101

Sie können Ihre database.yml in diese ändern, anstatt die sofort einsatzbereite 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
Chris Barretto
quelle
1
Soll ich project_test oder den Namen meiner Datenbank eingeben?
Vasseurth
5
Sie können es benennen, was Sie wollen. Wenn Ihr Projektname 'Rechner' ist, würde ich sie calculator_production, calculator_test, calculator_development nennen
Chris Barretto
2
@mmichael es kommt wirklich darauf an, wie du deine postgres eingerichtet hast. Wenn Sie unter MacOS X Lion + postgres.app, brauen oder native verwenden, gelten für die Standardeinstellung unterschiedliche Einschränkungen. Wenn Benutzername und Passwort nicht zutreffen, können Sie sie ohne oder ohne Werte weglassen. Dies war eher eine Art "Catch All" -Konfiguration.
Chris Barretto
2
Was macht '& TEST' dort (Zeile 9)?
David Rhoden
2
"& TEST" setzt TEST als Standardsatz von Optionen. Sie können später überschrieben oder einfach weggelassen werden. "<<: * TEST" ist der Weg, um auf die Standardeinstellung @DavidRhoden
Chris Barretto
44

Die folgenden Schritte haben bei mir funktioniert. Es nutzt die Hähne Juwel, erstellt von Heroku und in Ryan Bates Railscast # 342 erwähnt. Es gibt ein paar Schritte, aber es hat perfekt funktioniert (sogar Daten wurden korrekt migriert), und es war weitaus 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, für das Taps-Juwel jedoch etwas erforderlich ist. Ich habe gerade die Literale "Benutzer" und "Passwort" verwendet.

Erstellen Sie 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

BEARBEITEN - Befehl unten aktualisiert - verwenden Sie diesen stattdessen

$ createuser f3 -d -s

Erstellen Sie die erforderlichen Datenbanken

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

Aktualisieren Sie die Gemfile

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

Aktualisieren Sie 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:

Starten Sie den Taps-Server in der SQLite-Datenbank

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

Migrieren Sie die Daten

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

Starten Sie den Rails-Webserver neu

$ rails s

Bereinigen Sie die Gemfile

#gem 'sqlite3'
gem 'pg'
#gem 'taps'
$ bundle
ardochhigh
quelle
10

Da Sie zu Heroku wechseln, können Sie dazu Taps verwenden:

heroku db:push

Dadurch werden Ihre lokalen SQLite-Entwicklungsdaten in die Produktion übertragen, und Heroku wird automatisch für Sie in Postgres konvertiert.

Dies sollte auch funktionieren, um eine Produktions-SQLite-Datenbank nach Heroku zu verschieben, wird jedoch nicht getestet.

RAILS_ENV=production heroku db:push
Jesse Wolgamott
quelle
1
Das Taps-Juwel scheint mit 1.9.3 nicht gut zu funktionieren. Möglicherweise müssen Sie 1.9.2 lokal installieren, damit es ausgeführt werden kann. Nachdem ich das getan habe, war es unglaublich flüssig. github.com/ricardochimal/taps/issues/93
sbeam
Dies ist nicht mehr möglich. Siehe diese Frage für weitere Informationen: stackoverflow.com/questions/19817851/…
sykaeh
5

Sie müssen auch die Zeile " gem 'pg' " zu Ihrer gemfile hinzufügen, wobei 'pg' das aktuelle Postgres-Juwel für Rails ist.

Gus Shortz
quelle
5

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: 

Folgendes wird beim Ausführen generiert:

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

Fügen Sie dies auch Ihrem Gemfile hinzu:

gem 'pg'
Dschungel
quelle
5

Jetzt ist es mit dem einzigen Befehl einfach geworden

bin/rails db:system:change --to=postgresql
K ABHIRAM
quelle
1
Dies ist eine großartige Antwort. Sie ändert die Datei database.yml mit den erforderlichen Werten. Sie können dort immer noch hineingehen und den Datenbanknamen entsprechend Ihrem Projekt ändern.
Csalmeida
3

Nachdem ich den Edelstein 'sqlite3durch den Edelstein pgin der Edelsteindatei ersetzt hatte, bekam ich ihn immer wieder, sqlite3 errorwenn ich zum Heroku-Meister drückte, weil ich vergessen hatte, die aktualisierte Edelsteindatei festzuschreiben. Einfach das Folgende zu tun löste dieses Problem:

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

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 Schienen und die grundlegenden Standards sollten wie DRY, Konvention über Konfiguration usw. befolgt werden. Daher wiederholen wir im obigen Code nicht denselben Code immer wieder.

sunil
quelle
2

Es wurde über mir erwähnt, aber ich habe nicht genug Ruf als Lurker, um es zu verbessern. In der Hoffnung, etwas mehr Aufmerksamkeit für Rails-Neulinge zu erregen, die diese Antwort lesen:

Sie müssen auch die Zeile "gem 'pg'" zu Ihrer gemfile hinzufügen, wobei 'pg' das aktuelle Postgres-Juwel für Rails ist.

^^^ Dies ist ein Schlüsselelement zusätzlich zu der Datei database.yml, die in der ausgewählten Antwort beschrieben ist, um Ihre Rails-App nach Postgres zu migrieren.

Justin Houk
quelle
1

So habe ich mein Setup. Wenn Sie nur MRT 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
ianks
quelle
0

Heute hatte ich das gleiche Problem. Ich arbeite an Rails 4.2.8. Die Lösung bestand darin, in meinem Fall die pg gem-Version anzugeben 0.18.4.

Benjamin Peña Olvera
quelle