Zmień SQLite na PostgreSQL w nowym projekcie Rails

125

Mam aplikację railsową, której bazy danych są w SQLite (wersja deweloperska i produkcyjna). Ponieważ przechodzę do heroku, chcę przekonwertować moją bazę danych do PostgreSQL.

W każdym razie słyszałem, że lokalna, programistyczna baza danych nie musi być zmieniana z SQLite, więc nie muszę tego zmieniać, jednak jak mam przejść do zmiany środowiska produkcyjnego z SQLite na PostgreSQL?

Czy ktoś kiedykolwiek to zrobił i może pomóc?

PS Nie jestem pewien, jak dokładnie nazywa się ten proces, ale słyszałem o migracji bazy danych z SQLite do PostgreSQL, czy to należy zrobić?

Vasseurth
źródło
2
Czy masz dane produkcyjne na żywo, które muszą z nimi współpracować, czy jest to nowa / świeża aplikacja?
Dylan Markow
19
Zalecałbym również zmianę środowiska programistycznego na PostgreSQL. SQLite i PostgreSQL (i każda inna baza danych) mają różne koncepcje na temat tego, co oznacza „poprawny SQL” i żaden ORM nie może odizolować Cię od wszystkich dziwactw bazy danych.
mu jest za krótkie

Odpowiedzi:

101

Możesz zmienić swój plik database.yml na ten zamiast używać gotowego pliku sqlite:

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
źródło
1
Powinienem podać project_test czy nazwę mojej bazy danych?
Vasseurth,
5
Możesz nazwać to, co chcesz. Jeśli nazwa twojego projektu to „calculator”, nazwałbym go calculator_production, calculator_test, calculator_development
Chris Barretto
2
@mmichael, to naprawdę zależy od tego, jak skonfigurowałeś postgres. Używanie postgres.app, brew lub native w przypadku MacOS X Lion + ma różne ograniczenia dotyczące ich domyślnej konfiguracji. Więc jeśli nazwa użytkownika i hasło nie mają zastosowania, możesz je pominąć lub wprowadzić bez wartości. To była raczej konfiguracja typu „catch all”.
Chris Barretto
2
Co tam robi „& TEST” (wiersz 9)?
David Rhoden
2
„& TEST” ustawia TEST jako domyślny zestaw opcji. Można je później zastąpić lub po prostu pominąć. „<<: * TEST” to sposób na dostęp do domyślnego @DavidRhoden
Chris Barretto,
44

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

Zauważ, że SQLite nie ma identyfikatora użytkownika ani hasła, ale klejnot taps czegoś wymaga. Po prostu użyłem literałów „użytkownik” 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

EDYCJA - zaktualizowane polecenie poniżej - użyj go zamiast tego

$ createuser f3 -d -s

Utwórz wymagane bazy danych

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

Zaktualizuj plik Gemfile

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

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

Uruchom serwer taps w bazie danych sqlite

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

Przeprowadź migrację danych

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

Zrestartuj serwer WWW Rails

$ rails s

Oczyść plik Gemfile

#gem 'sqlite3'
gem 'pg'
#gem 'taps'
$ bundle
ardochhigh
źródło
10

Ponieważ przechodzisz do heroku, możesz to zrobić za pomocą dotknięć:

heroku db:push

Spowoduje to przeniesienie danych sqlite z lokalnego rozwoju do produkcji, a heroku automatycznie przekształci się w postgres.

Powinno to również działać, aby wypchnąć produkcyjną bazę danych sqlite do heroku, ale nie jest to testowane.

RAILS_ENV=production heroku db:push
Jesse Wolgamott
źródło
1
klejnot kranów nie wydaje się działać dobrze z 1.9.3, być może będziesz musiał zainstalować lokalnie 1.9.2, aby go uruchomić - kiedy to zrobiłem, było niesamowicie
sbeam
To już nie jest możliwe. Zobacz to pytanie, aby uzyskać więcej informacji: stackoverflow.com/questions/19817851/…
sykaeh
5

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

Gus Shortz
źródło
5

Po prostu zaktualizuj plik 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: 

Powyższe informacje są generowane podczas uruchamiania:

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

Dodaj to również do swojego Gemfile:

gem 'pg'
jungledre
źródło
5

Teraz staje się to łatwe za pomocą jednego polecenia

bin/rails db:system:change --to=postgresql
K ABHIRAM
źródło
1
To świetna odpowiedź, zmienia plik database.yml na potrzebne wartości. Nadal możesz tam wejść i zmienić nazwę bazy danych zgodnie z projektem.
csalmeida
3

Po wymianie klejnotu na 'sqlite3klejnot pgw pliku klejnotów, nadal otrzymywałem ikonę, sqlite3 errorgdy naciskałem na mistrza Heroku, ponieważ zapomniałem zatwierdzić zaktualizowanego pliku gem. Po prostu wykonanie następujących czynności rozwiązało problem:

git add .
git commit -m 'heroku push'
heroku create 
git push heroku master
Zorak
źródło
3

Po prostu zaktualizuj swój 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

Używamy szyn i należy przestrzegać podstawowych standardów, takich jak DRY, Convention over Configuration itp., Więc w powyższym kodzie nie będziemy powtarzać tego samego kodu w kółko.

sunil
źródło
2

Wspomniałem o tym powyżej, ale nie mam wystarczającej reputacji jako czający się, aby móc to głosować. W nadziei na zwrócenie większej uwagi początkującym użytkownikom Rails, czytającym tę odpowiedź:

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

^^^ Jest to kluczowy element, oprócz pliku database.yml opisanego w wybranej odpowiedzi, dotyczący migracji aplikacji Rails do Postgres.

Justin Houk
źródło
1

Oto jak 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
Ianks
źródło
0

Dzisiaj miałem ten sam problem. Pracuję na Railsach 4.2.8. Rozwiązaniem było określenie wersji pg gem, w moim przypadku 0.18.4.

Benjamin Peña Olvera
źródło