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ć?
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
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
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
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.
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'
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
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.
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.
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
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
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:
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
.
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