2012-01-05 26 views
7

Tôi đang cố gắng đẩy một ứng dụng Ruby on Rails hoàn toàn mới lên Heroku. Hiện tại, nó nằm trên MySQL. Dường như Heroku không thực sự hỗ trợ MySQL và vì vậy chúng tôi đang xem xét sử dụng PostgreSQL, mà họ DO hỗ trợ.chuyển từ MySQL sang PostgreSQL cho Ruby on Rails vì lợi ích của Heroku

Tôi khó có thể mong đợi điều này như thế nào? Tôi cần phải làm gì để thực hiện điều này?

Một lần nữa, xin lưu ý rằng DB của tôi ngay bây giờ (cả hai phát triển & sản xuất) đều hoàn toàn trống.

Trả lời

4

Không cảm thấy bạn phải di chuyển sang Postgres - có một số nhà cung cấp MySQL Addon có sẵn trên Heroku - http://addons.heroku.com/cleardb là một trong những công ty tôi đã thành công nhất.

+0

Tôi có thể phải tiếp tục và thử điều này, cảm ơn thông tin! –

+0

Cần lưu ý rằng addon MySQL có những hạn chế làm cho nó không thực tế cho các ứng dụng nghiêm trọng. – Dan

0

Cần đơn giản là: chuyển DDL từ MySQL sang PostgreSQL.

Heroku có bất kỳ tập lệnh tạo giản đồ nào không? Tôi phụ thuộc vào những người đó nếu họ có sẵn.

MySQL và PostgreSQL khác nhau (ví dụ: loại nhận dạng cho MySQL, trình tự cho PostgreSQL). Nhưng cổng không quá khó. Có bao nhiêu bảng? Hàng chục là doable.

4

Nếu bạn không có dữ liệu để di chuyển, nó phải là đơn giản như nói Gemfile bạn để sử dụng pg đá quý thay vào đó, chạy bundle install, và cập nhật tập tin database.yml của bạn để trỏ đến cơ sở dữ liệu PostgreSQL của bạn. Sau đó, chỉ cần di chuyển của bạn (rake db:migrate) và mọi thứ sẽ hoạt động tốt.

9

Những vấn đề chung:

  1. GROUP BY hành vi. PostgreSQL có GROUP BY khá nghiêm ngặt. Nếu bạn sử dụng mệnh đề GROUP BY, thì mỗi cột trong SELECT của bạn phải xuất hiện trong GROUP BY hoặc được sử dụng trong hàm tổng hợp.
  2. Cắt ngắn dữ liệu. MySQL sẽ lặng lẽ cắt ngắn chuỗi dài để vừa với một cột char(n) trừ khi máy chủ của bạn ở chế độ nghiêm ngặt, PostgreSQL sẽ khiếu nại và làm cho bạn cắt xén chuỗi của mình.
  3. Trích dẫn là khác nhau, MySQL sử dụng backticks để trích dẫn số nhận dạng trong khi PostgreSQL sử dụng dấu ngoặc kép.
  4. LIKE là trường hợp không nhạy cảm trong MySQL nhưng không phải trong PostgreSQL. Điều này dẫn nhiều người dùng MySQL sử dụng LIKE như một toán tử bình đẳng không phân biệt chữ hoa chữ thường.

(1) sẽ là vấn đề nếu bạn sử dụng phương thức AR2 group trong bất kỳ truy vấn nào hoặc GROUP BY trong bất kỳ SQL thô nào. Thực hiện một số tìm kiếm column "X" must appear in the GROUP BY clause or be used in an aggregate function và bạn sẽ thấy một số ví dụ và giải pháp phổ biến.

(2) sẽ là vấn đề nếu bạn sử dụng cột chuỗi ở bất kỳ đâu trong ứng dụng của mình và mô hình của bạn không xác thực hợp lệ độ dài tất cả giá trị chuỗi đến. Lưu ý rằng việc tạo một cột chuỗi trong Rails mà không chỉ định một giới hạn thực sự tạo ra một cột varchar(255) do đó thực sự là một ẩn :limit => 255 mặc dù bạn không chỉ định một. Cách khác là sử dụng t.text cho các chuỗi của bạn thay vì t.string; điều này sẽ cho phép bạn làm việc với các chuỗi lớn tùy ý mà không bị phạt (đối với PostgreSQL ít nhất). Như Erwin lưu ý dưới đây (và mọi cơ hội khác anh ta nhận được), varchar(n) là một chút của một lỗi thời trong thế giới PostgreSQL.

(3) không phải là vấn đề trừ khi bạn có SQL thô trong mã của mình.

(4) sẽ là vấn đề nếu bạn đang sử dụng LIKE ở bất kỳ đâu trong ứng dụng của mình.Bạn có thể sửa lỗi này bằng cách thay đổi a like b thành lower(a) like lower(b) (hoặc upper(a) like upper(b) nếu bạn muốn hét) hoặc a ilike b nhưng lưu ý rằng PostgreSQL's ILIKE là không chuẩn.

Có những khác biệt khác có thể gây ra sự cố nhưng những vấn đề này có vẻ như là vấn đề phổ biến nhất.

Bạn sẽ phải xem xét một vài điều để cảm thấy an toàn:

  • group cuộc gọi.
  • SQL thô (bao gồm bất kỳ đoạn mã nào trong các cuộc gọi where).
  • Xác thực độ dài chuỗi trong các mô hình của bạn.
  • Tất cả các công dụng của LIKE.
+1

Quảng cáo 1. GROUP BY: điều này đúng với phiên bản 8.3 (Heroku), nhưng đã thay đổi trong phiên bản 9.1. [Ghi chú phát hành cho chúng tôi biết] (http://www.postgresql.org/docs/9.1/interactive/release-9-1.html): 'Cho phép cột không GROUP BY trong danh sách đích truy vấn khi khóa chính được chỉ định trong mệnh đề GROUP BY (Peter Eisentraut) ' –

+1

Quảng cáo 2. Bạn có thể tránh tất cả các rắc rối bằng cách sử dụng kiểu dữ liệu chuỗi cao hơn' văn bản' trong PostgreSQL (hoặc 'varchar' không có độ dài specifier). ** Nếu ** bạn có 'varchar (n)' cột, bạn có thể tránh lỗi bằng cách đúc một cách rõ ràng: ''foobarbaz' :: varchar (3)'. Tôi trích dẫn [hướng dẫn] (http://www.postgresql.org/docs/9.1/interactive/datatype-character.html): 'chiều dài quá dài sẽ bị cắt bớt thành n ký tự mà không gây ra lỗi.' –

+0

@Erwin: Heroku sử dụng 8,3 cho chia sẻ, 9,0 cho chuyên dụng để vấn đề GROUP BY vẫn áp dụng cho đến khi Heroku được xung quanh để nâng cấp (Tôi đã hy vọng cho một bản nâng cấp 9,1 chỉ để có được Peter của GROUP BY thay đổi). Và bạn đang mắc kẹt với các vấn đề varchar khi sử dụng Rails trừ khi bạn sử dụng 'văn bản' thay vì' chuỗi' cho các cột của bạn (đó là các loại Rails, không phải là những cái PostgreSQL), bạn cũng sẽ không thể đưa phôi vào SQL trừ khi bạn viết tất cả bằng tay và điều đó sẽ không xảy ra trong mã Rails. –

Các vấn đề liên quan