Passa da SQLite a PostgreSQL in un nuovo progetto Rails


125

Ho un'app di rotaie che i database sono in SQLite (lo sviluppo e la produzione). Da quando mi trasferisco a Heroku, voglio convertire il mio database in PostgreSQL.

Comunque, ho sentito che il database locale, di sviluppo e di sviluppo non ha bisogno di essere cambiato da SQLite, quindi non ho bisogno di cambiarlo, tuttavia, come posso cambiare l'ambiente di produzione da SQLite a PostgreSQL?

Qualcuno l'ha mai fatto prima e può aiutare?

PS Non sono sicuro di come si chiami esattamente questo processo, ma ho sentito parlare della migrazione del database da SQLite a PostgreSQL, è che cosa bisogna fare?


2
Hai dati di produzione in tempo reale che devono essere accompagnati o è un'app nuova / fresca?
Dylan Markow,

19
Ti consiglio di cambiare anche l'ambiente di sviluppo in PostgreSQL. SQLite e PostgreSQL (e ogni altro database) hanno idee diverse sul significato di "SQL valido" e nessun ORM può isolarti da tutte le idiosincrasie del database.
mu è troppo corto il

Risposte:


101

Puoi modificare il tuo database.yml in questo invece di usare quello sqlite out of the box:

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

1
Devo inserire project_test o il nome del mio database?
Vasseurth,

5
Puoi nominarlo come vuoi. Se il nome del tuo progetto è 'calcolatrice', li chiamerei calcolatrice_produzione, calcolatrice_testo, calcolatrice_sviluppo
Chris Barretto

2
@mmichael dipende davvero da come hai impostato i tuoi postgres. L'uso di postgres.app, brew o native se sei su MacOS X Lion + ha restrizioni diverse sulla configurazione predefinita. Quindi, se nome utente e password non si applicano, è possibile lasciarli fuori o dentro senza valori. Questo era solo un tipo di configurazione "catch all".
Chris Barretto,

2
Cosa sta facendo "& TEST" (riga 9)?
David Rhoden,

2
"& TEST" sta impostando TEST come set predefinito di opzioni. In seguito possono essere sostituiti o semplicemente esclusi. "<<: * TEST" è il modo per accedere all'impostazione predefinita @DavidRhoden
Chris Barretto

44

I passaggi seguenti hanno funzionato per me. Utilizza la gemma dei rubinetti , creata da Heroku e menzionata nel Railscast # 342 di Ryan Bates. Ci sono alcuni passaggi ma ha funzionato perfettamente (anche le date sono state migrate correttamente) ed è stato molto più semplice delle migrazioni Oracle -> DB2 o SQL Server -> Oracle che ho fatto in passato.

Nota che SQLite non ha un ID utente o una password, ma la gemma dei tocchi richiede qualcosa. Ho appena usato i letterali "utente" e "password".

Crea l'utente del database Postgres per i nuovi database

$ 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 - comando aggiornato di seguito - utilizzare invece questo

$ createuser f3 -d -s

Creare i database richiesti

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

Aggiorna il Gemfile

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

Aggiorna 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:

Avviare il server dei tocchi sul database sqlite

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

Migrare i dati

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

Riavvia il server web Rails

$ rails s

Pulisci il Gemfile

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

10

Dal momento che ti stai trasferendo a Heroku, puoi usare i tocchi per fare questo:

heroku db:push

Questo spingerà i tuoi dati sqlite di sviluppo locale alla produzione e heroku si convertirà automaticamente in postgres per te.

Questo dovrebbe funzionare anche per spingere un db sqlite di produzione in heroku, ma non è stato testato.

RAILS_ENV=production heroku db:push

1
la gemma dei tap non sembra funzionare bene con 1.9.3, potrebbe essere necessario installare 1.9.2 localmente per farlo funzionare - una volta che l'ho fatto è stato incredibilmente fluido github.com/ricardochimal/taps/issues/93
sbeam

Questo non è più possibile. Vedere questa domanda per ulteriori informazioni: stackoverflow.com/questions/19817851/...
sykaeh

5

dovrai anche aggiungere la riga " gem 'pg' " al tuo file di gemme, 'pg' essendo l'attuale gemma di postgres per Rails.


5

Aggiorna semplicemente il file 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: 

Quanto sopra è ciò che viene generato quando si esegue:

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

Aggiungilo anche al tuo Gemfile:

gem 'pg'

5

Ora è diventato facile con il singolo comando

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

1
Questa è un'ottima risposta, cambia database.yml con i valori necessari. Puoi ancora andare lì e cambiare il nome del database in base al tuo progetto.
csalmeida,

3

Dopo aver sostituito gemma 'sqlite3con gemma pgnel file gemma , ho continuato a ricevere informazioni sqlite3 errorquando spingevo verso il master Heroku perché mi ero dimenticato di eseguire il commit del file gemma aggiornato. Semplicemente facendo quanto segue risolto questo:

git add .
git commit -m 'heroku push'
heroku create 
git push heroku master

3

Basta aggiornare 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

Stiamo usando le rotaie e gli standard di base dovrebbero essere come DRY, Convention over Configuration ecc. Quindi nel codice sopra non ripetiamo lo stesso codice ancora e ancora.


2

È stato menzionato sopra di me, ma non ho abbastanza reputazione come in agguato per poterlo votare. Nella speranza di attirare un po 'più di attenzione per i neofiti di Rails leggendo questa risposta:

dovrai anche aggiungere la riga "gem 'pg'" al tuo file di gemme, 'pg' essendo l'attuale gemma di postgres per Rails.

^^^ Questo è un elemento chiave in aggiunta al file database.yml descritto nella risposta selezionata per migrare l'app Rails su Postgres.


1

Ecco come ho impostato il mio. Se si utilizza solo la risonanza magnetica e non Jruby, è possibile saltare la logica nelle impostazioni dell'adattatore.

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



0

Oggi ho avuto lo stesso problema. Sto lavorando su Rails 4.2.8. La soluzione era specificare la versione di pg gem, nel mio caso 0.18.4.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.