새로운 Rails 프로젝트에서 SQLite에서 PostgreSQL로 변경


125

데이터베이스가 SQLite (개발자 및 프로덕션) 인 Rails 앱이 있습니다. heroku로 이동하고 있으므로 데이터베이스를 PostgreSQL로 변환하고 싶습니다.

어쨌든 로컬, 개발 및 데이터베이스를 SQLite에서 변경할 필요가 없다고 들었습니다. 따라서 변경할 필요는 없지만 프로덕션 환경을 SQLite에서 PostgreSQL로 변경하는 방법은 무엇입니까?

아무도 전에 이것을 해본 적이 있고 도울 수 있습니까?

추신 :이 프로세스가 정확히 무엇인지 확실하지 않지만 SQLite에서 PostgreSQL로 데이터베이스를 마이그레이션하는 것에 대해 들었습니다. 무엇을해야합니까?


2
라이브 프로덕션 데이터가 있어야합니까, 아니면 새롭거나 새로운 앱입니까?
Dylan Markow

19
개발 환경을 PostgreSQL로 변경하는 것이 좋습니다. SQLite와 PostgreSQL (및 기타 모든 데이터베이스)에는 "유효한 SQL"의 의미에 대한 아이디어가 다르며 ORM이 모든 데이터베이스의 고유성으로부터 사용자를 격리시킬 수는 없습니다.
mu는 너무 짧습니다

답변:


101

즉시 사용 가능한 sqlite를 사용하는 대신 database.yml을 이것으로 변경할 수 있습니다.

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
project_test 또는 데이터베이스 이름을 넣어야합니까?
Vasseurth

5
원하는대로 이름을 지정할 수 있습니다. 프로젝트 이름이 '계산기'인 경우 calculator_production, calculator_test, calculator_development
Chris Barretto

2
@ mmichael 그것은 실제로 postgres를 어떻게 설정했는지에 달려 있습니다. MacOS X Lion +를 사용하는 경우 postgres.app, brew 또는 native를 사용하면 기본 설정에 대해 다른 제한이 있습니다. 따라서 사용자 이름과 비밀번호가 적용되지 않으면 그대로 두거나 값을 입력하지 않아도됩니다. 이것은 '캐치 모두'유형의 구성에 지나지 않습니다.
Chris Barretto

2
거기에서 '& TEST'는 무엇입니까 (9 행)?
David Rhoden

2
"& TEST"는 TEST를 기본 옵션 세트로 설정합니다. 나중에 무시하거나 방치 할 수 있습니다. "<< * TEST는"@DavidRhoden 기본에 액세스 할 수있는 방법입니다
크리스 Barretto

44

아래 단계는 나를 위해 일했습니다. Heroku가 제작하고 Ryan Bates의 Railscast # 342에서 언급 한 보석을 사용합니다 . 몇 가지 단계가 있지만 완벽하게 작동했으며 (날짜가 올바르게 마이그레이션 되었음) 과거에 수행 한 Oracle-> DB2 또는 SQL Server-> Oracle 마이그레이션보다 훨씬 쉽습니다.

SQLite에는 사용자 ID 또는 비밀번호가 없지만 탭 보석에는 무언가가 필요합니다. 방금 문자 "user"와 "password"를 사용했습니다.

새 데이터베이스에 대한 Postgres 데이터베이스 사용자 생성

$ 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

편집-아래의 업데이트 된 명령-대신 사용하십시오

$ createuser f3 -d -s

필요한 데이터베이스 생성

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

Gemfile 업데이트

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

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:

sqlite 데이터베이스에서 탭 서버를 시작하십시오.

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

데이터 이전

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

Rails 웹 서버를 다시 시작하십시오

$ rails s

젬 파일 정리

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

10

heroku로 이동 중이므로 탭을 사용하여 다음을 수행 할 수 있습니다.

heroku db:push

이를 통해 로컬 개발 sqlite 데이터를 프로덕션으로 푸시하고 heroku는 자동으로 postgres로 변환합니다.

이것은 생산 sqlite db를 heroku로 푸시하기 위해 작동하지만 테스트되지 않았습니다.

RAILS_ENV=production heroku db:push

1
나는 그것이 mindblowingly 부드러운 것을 한 번 - 도청 보석은 당신이 그것을 실행에 도착하는 로컬 1.9.2를 설치해야 할 수도 있습니다, 잘 1.9.3와 함께 작동하지 않는 것 github.com/ricardochimal/taps/issues/93을
sbeam

더 이상 불가능합니다. 자세한 내용은이 질문을 참조하십시오. stackoverflow.com/questions/19817851/…
sykaeh

5

Rails의 현재 postgres gem 인 'pg' 줄을 gem 파일 에 추가해야합니다 .


5

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: 

위는 다음을 실행할 때 생성되는 것입니다.

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

또한 이것을 Gemfile에 추가하십시오 :

gem 'pg'

5

이제 단일 명령으로 쉬워졌습니다

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

1
이것은 훌륭한 대답이며, 필요한 값으로 database.yml을 변경합니다. 여전히 거기에 들어가서 프로젝트에 따라 데이터베이스 이름을 변경할 수 있습니다.
csalmeida

3

gemfile에서 gem 'sqlite3을 gem pg으로 교체 한 후 sqlite3 error업데이트 된 gemfile을 커밋하는 것을 잊었 기 때문에 Heroku 마스터로 푸시 할 때 계속 사용 했습니다. 간단히 다음을 수행하면이 문제가 해결되었습니다.

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

3

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

우리는 레일을 사용하고 있으며 기본 표준은 DRY, 컨벤션에 대한 컨벤션 등과 같은 규칙을 따라야합니다. 따라서 위의 코드에서 동일한 코드를 반복해서 반복하지 않습니다.


2

그것은 나 위에서 언급되었지만, 그것을지지 할 수있는 사기꾼으로서의 명성은 충분하지 않습니다. 이 답변을 읽는 Rails 초보자에게 더 많은 관심을 끌기를 희망합니다.

Rails의 현재 postgres gem 인 'pg'줄을 gem 파일에 추가해야합니다.

^^^ 이것은 Rails 앱을 Postgres로 마이그레이션하기 위해 선택된 답변에 설명 된 database.yml 파일 외에도 중요한 부분입니다.


1

이것이 내가 설정 한 방법입니다. Jruby가 아닌 MRI 만 사용하는 경우 어댑터 설정에서 논리를 건너 뛸 수 있습니다.

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

오늘 나는 같은 문제가있었습니다. Rails 4.2.8에서 일하고 있습니다. 해결책은 pg gem 버전을 지정했습니다 0.18.4.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.