Zmiana z SQLite na PostgreSQL w projekcie fresh Rails

Mam aplikację rails, która jest w SQLite (dev i production). Ponieważ przenoszę się do heroku, chcę przekonwertować moją bazę danych do PostgreSQL.

W każdym razie słyszałem, że lokalna, rozwojowa baza danych nie musi być zmieniana z SQLite, więc nie muszę tego zmieniać, jednak jak mam zmienić środowisko produkcyjne z SQLite na PostgreSQL?

Czy ktoś już to robił i może pomóc?

P. S. Nie wiem co dokładnie to proces się nazywa, ale słyszałem o migracji bazy danych z SQLite do PostgreSQL, czy to jest to, co trzeba zrobić?

Author: lulalala, 2011-07-15

12 answers

Możesz zmienić swoją bazę danych.yml do tego zamiast używać out of the box SQLite one:

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
 96
Author: Chris Barretto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-05 16:56:55

Poniższe kroki zadziałały dla mnie. Używa klejnotu taps , stworzonego przez Heroku i wspominanego w Railscastu Ryana Batesa #342. Jest kilka kroków, ale działało idealnie (nawet daty były poprawnie migrowane) i było o wiele łatwiejsze niż migracje Oracle -> DB2 lub SQL Server -> Oracle, które robiłem w przeszłości.

Zauważ, że SQLite nie ma identyfikatora użytkownika ani hasła, ale klejnot taps czegoś wymaga. Właśnie użyłem literki "user" i "hasło".

Utwórz użytkownika bazy danych Postgres dla nowych baz danych

$ 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-aktualizacja polecenia poniżej-użyj tego zamiast

$ createuser f3 -d -s

Tworzenie wymaganych baz danych

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

Update the Gemfile

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

Aktualizacja bazy danych.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:

Uruchom serwer taps w bazie danych SQLite

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

Migracja danych

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

Uruchom ponownie Rails webserver

$ rails s

Cleanup The Gemfile

#gem 'sqlite3'
gem 'pg'
#gem 'taps'
$ bundle
 43
Author: ardochhigh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-16 16:02:16

Ponieważ przenosisz się do heroku, możesz użyć kranów, aby to zrobić:

heroku db:push

To przesunie Twoje dane SQLite o lokalnym rozwoju do produkcji, a heroku automatycznie przekonwertuje dla Ciebie postgres.

Powinno to również zadziałać, aby wypchnąć produkcyjny SQLite db do heroku, ale nie jest to testowane.

RAILS_ENV=production heroku db:push
 9
Author: Jesse Wolgamott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-15 17:26:54

Będziesz również musiał dodać wiersz " gem ' pg ' " do pliku gemfile,' pg ' jest aktualnym gem postgres dla Rails.

 5
Author: Gus Shortz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-31 09:36:41

Po prostu zaktualizuj konfigurację/bazę danych.plik 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: 

Powyższe jest to, co jest generowane podczas uruchamiania:

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

Dodaj również to do swojego Gemfile:

gem 'pg'
 5
Author: jungledre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-17 07:22:07

Po zastąpieniu gem 'sqlite3 przez gem pg w pliku gemfile, otrzymywałem sqlite3 error podczas pchania do mistrza Heroku, ponieważ zapomniałem zatwierdzić zaktualizowany plik gemfile. Po prostu wykonując następujące rozwiązanie:

git add .
git commit -m 'heroku push'
heroku create 
git push heroku master
 3
Author: Zorak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-27 06:58:26

Po prostu zaktualizuj bazę danych.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

Używamy rails i podstawowe standardy powinny być takie jak DRY, Convention over Configuration itp.. w powyższym kodzie nie powtarzamy więc ciągle tego samego kodu.

 3
Author: sunil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-04 14:44:46

To było wspomniane powyżej mnie, ale nie mam wystarczającej reputacji jako czaiciel, aby móc to poprawić. W nadziei, że przyciągnie trochę więcej uwagi do rails newbies czytając tę odpowiedź:

Będziesz również musiał dodać linię " gem ' pg '"do pliku gemfile,' pg ' jest aktualnym gem postgres dla Rails.

^ ^ ^ to jest kluczowy element oprócz bazy danych.plik yml opisany w wybranej odpowiedzi do migracji aplikacji Rails do Postgres.

 2
Author: Justin Houk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-09 12:31:32

Tak mam swoją konfigurację. Jeśli używasz tylko MRI, a nie Jruby, możesz pominąć logikę w Ustawieniach adaptera.

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
Author: ianks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-02 05:00:33

Możesz spróbować podążać za: sqlite3 development.db .dump | psql dbname username

Lub spróbuj z sqlitetopgscript: http://trac-hacks.org/browser/sqlitetopgscript/0.10/sqlite2pg

 0
Author: Vibhor Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-15 17:36:08

Możliwym rozwiązaniem (nie dla heroku) jest użycie yaml.db from:

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

 0
Author: F.Filippi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-05 16:38:23

Dzisiaj miałem ten sam problem. Pracuję nad Rails 4.2.8. Rozwiązaniem była wersja pg gem, w moim przypadku 0.18.4.

 0
Author: Benjamin Peña Olvera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-02 04:20:24