Thay đổi từ SQLite sang PostgreSQL trong dự án Rails mới


125

Tôi có một ứng dụng rails là cơ sở dữ liệu bằng SQLite (Nhà phát triển và sản xuất). Vì tôi đang chuyển sang heroku, tôi muốn chuyển đổi cơ sở dữ liệu của mình sang PostgreSQL.

Dù sao, tôi nghe nói rằng cơ sở dữ liệu, phát triển, cục bộ không cần phải thay đổi từ SQLite, vì vậy tôi không cần phải thay đổi điều đó, tuy nhiên, làm thế nào để tôi thay đổi môi trường sản xuất từ ​​SQLite sang PostgreQuery?

Có ai đã từng làm điều này trước đây và có thể giúp đỡ?

PS Tôi không chắc chính xác quy trình này được gọi là gì, nhưng tôi đã nghe nói về việc di chuyển cơ sở dữ liệu từ SQLite sang PostgreQuery, đó có phải là những gì cần phải làm không?


2
Bạn có dữ liệu sản xuất trực tiếp cần phải đi kèm với nó, hoặc nó là một ứng dụng mới / mới?
Dylan Markow

19
Tôi cũng khuyên bạn nên thay đổi môi trường phát triển của mình thành PostgreSQL. SQLite và PostgreSQL (và mọi cơ sở dữ liệu khác) có các ý tưởng khác nhau về "SQL hợp lệ" nghĩa là gì và không ORM nào có thể bảo vệ bạn khỏi tất cả các đặc điểm riêng của cơ sở dữ liệu.
mu quá ngắn

Câu trả lời:


101

Bạn có thể thay đổi cơ sở dữ liệu của mình.yml thành cái này thay vì sử dụng hộp sqlite bên ngoài:

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
Tôi nên đặt project_test hoặc tên cơ sở dữ liệu của tôi?
Vasseurth

5
Bạn có thể đặt tên cho nó bất cứ điều gì bạn muốn. Nếu tên dự án của bạn là 'máy tính', tôi sẽ đặt tên cho chúng là
Calculator_production, Calculator_test, Calculator_development

2
@mmichael nó thực sự phụ thuộc vào cách bạn thiết lập postgres của bạn. Sử dụng postgres.app, brew hoặc bản địa nếu bạn sử dụng MacOS X Lion + có các hạn chế khác nhau đối với thiết lập mặc định của chúng. Vì vậy, nếu tên người dùng và mật khẩu không được áp dụng, bạn có thể bỏ chúng hoặc không có giá trị. Đây chỉ là một loại cấu hình 'bắt tất cả'.
Chris Barretto

2
'& TEST' đang làm gì ở đó (dòng 9)?
David Rhoden

2
"& TEST" đang đặt TEST làm bộ tùy chọn mặc định. Họ sau đó có thể bị ghi đè hoặc chỉ cần bỏ đi. "<<: * KIỂM TRA" là cách để truy cập @DavidRhoden mặc định
Chris Barretto

44

Các bước dưới đây làm việc cho tôi. Nó sử dụng đá quý vòi , được tạo bởi Heroku và được đề cập trong Railscast # 342 của Ryan Bates. Có một vài bước nhưng nó hoạt động hoàn hảo (ngay cả ngày được di chuyển chính xác) và nó dễ dàng hơn nhiều so với Oracle -> Máy chủ DB2 hoặc SQL -> Di chuyển Oracle tôi đã thực hiện trong quá khứ.

Lưu ý rằng SQLite không có id người dùng hoặc mật khẩu, nhưng đá quý vòi yêu cầu một cái gì đó. Tôi chỉ sử dụng chữ "người dùng" và "mật khẩu".

Tạo người dùng cơ sở dữ liệu Postgres cho cơ sở dữ liệu mới

$ 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 - Lệnh cập nhật bên dưới - sử dụng lệnh này thay thế

$ createuser f3 -d -s

Tạo cơ sở dữ liệu cần thiết

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

Cập nhật Gemfile

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

Cập nhật cơ sở dữ liệu.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:

Bắt đầu máy chủ vòi trên cơ sở dữ liệu sqlite

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

Di chuyển dữ liệu

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

Khởi động lại máy chủ web Rails

$ rails s

Dọn dẹp Gemfile

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

10

Vì bạn đang chuyển sang heroku, bạn có thể sử dụng vòi để làm điều này:

heroku db:push

Điều này sẽ đẩy dữ liệu sqlite phát triển địa phương của bạn vào sản xuất và heroku sẽ tự động chuyển đổi thành postgres cho bạn.

Điều này cũng sẽ hoạt động để đẩy db sqlite sản xuất lên heroku, nhưng nó không được thử nghiệm.

RAILS_ENV=production heroku db:push

1
đá quý vòi dường như không hoạt động tốt với 1.9.3, bạn có thể cần phải cài đặt 1.9.2 cục bộ để chạy nó - một khi tôi đã làm điều đó thì github.com/ricardochimal/taps/issues/93
sbeam

Điều này là không còn có thể. Xem câu hỏi này để biết thêm thông tin: stackoverflow.com/questions/19817851/ từ
sykaeh

5

bạn cũng sẽ cần thêm dòng " gem 'pg' " vào gemfile của mình, 'pg' là viên ngọc postgres hiện tại cho Rails.


5

Chỉ cần cập nhật tệp 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: 

Trên đây là những gì được tạo ra khi bạn chạy:

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

Đồng thời thêm phần này vào Gemfile của bạn:

gem 'pg'

5

Bây giờ nó trở nên dễ dàng với lệnh đơn

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

1
Đây là một câu trả lời tuyệt vời, nó thay đổi cơ sở dữ liệu.yml với các giá trị cần thiết. Bạn vẫn có thể vào đó và thay đổi tên cơ sở dữ liệu theo dự án của bạn.
csalmeida

3

Sau khi thay thế đá quý 'sqlite3bằng đá quý pgtrong đá quý , tôi tiếp tục nhận được sqlite3 errorkhi đẩy lên chủ nhân Heroku vì tôi quên cam kết đá quý đã cập nhật. Đơn giản chỉ cần làm như sau đã giải quyết điều này:

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

3

Chỉ cần cập nhật cho bạn 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

Chúng tôi đang sử dụng đường ray và các tiêu chuẩn cơ bản nên được tuân theo như DRY, Quy ước về cấu hình, v.v. vì vậy trong đoạn mã trên, chúng tôi không lặp lại cùng một mã.


2

Nó đã được đề cập ở trên tôi, nhưng tôi không có đủ danh tiếng như một kẻ ẩn giấu để có thể nâng cao nó. Với hy vọng thu hút thêm một chút sự chú ý cho người mới Rails đọc câu trả lời này:

bạn cũng sẽ cần thêm dòng "gem 'pg'" vào gemfile của mình, 'pg' là viên ngọc postgres hiện tại cho Rails.

^ ^ Đây là một phần quan trọng ngoài tệp cơ sở dữ liệu.yml được mô tả trong câu trả lời đã chọn để di chuyển ứng dụng Rails của bạn sang Postgres.


1

Đây là cách tôi có thiết lập của tôi. Nếu bạn chỉ sử dụng MRI và không phải là Jruby, bạn có thể bỏ qua logic trong cài đặt bộ điều hợp.

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

Hôm nay tôi có vấn đề tương tự. Tôi đang làm việc trên Rails 4.2.8. Giải pháp được chỉ định phiên bản đá quý pg, trong trường hợp của tôi , 0.18.4.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.