새로운 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.