15

Dường như bất cứ khi nào tôi thay đổi mô hình của mình, Play Framework yêu cầu tôi chạy một tập lệnh xóa toàn bộ lược đồ của tôi và tạo lại nó. Rõ ràng điều này sẽ không làm việc cho sản xuất, vì vậy cách thích hợp để xử lý điều này trong sản xuất là gì?Cách xử lý các diễn biến cơ sở dữ liệu của Play Framework 2 trong sản xuất

Lưu ý, tôi đang sử dụng ebean và Postgres và lưu trữ trên heroku.

Trả lời

29

Thật không may Ebean có thể tạo chỉ CREATE DDL (và không UPDATE DDL) (như answered on their group), do đó bạn cần phải chuyển sang manual evolutions càng sớm càng tốt.

một số quy tắc:

  1. Luôn backup DB sống của bạn trước khi thực hiện bất kỳ thay đổi :)
  2. Plugin ebean tái tạo toàn bộ DDL nếu nó chỉ có 1.sql tiến hóa tạo ra bởi nó
  3. Bạn cần phải loại bỏ hai đầu ý kiến ​​từ 1.sql và bắt đầu viết các diễn biến riêng với các số tiếp theo 2.sql, 3.sql vv. Cố gắng đặt càng nhiều mô hình/trường càng tốt trước khi chuyển sang diễn biến thủ công. Phần lớn nhất sẽ được thực hiện tự động bằng plugin.
  4. diễn biến thủ công nên chứa ALTERS đối với bảng/cột hiện tại thay vì DROP/CREATE, chúng phải có cả hai: UpsDowns cho mỗi thay đổi.
  5. cố gắng đặt càng nhiều thay đổi trong mỗi lần tiến hóa càng tốt, dễ quản lý hơn sau đó viết tiến hóa riêng biệt cho từng thay đổi nhỏ.

Đôi khi nó chỉ dễ dàng thay đổi cấu trúc DB bằng DB gui, dù sao nó cũng hoạt động chủ yếu cho nhà phát triển đơn lẻ ... khi bạn cần chia sẻ mã của mình với các nhà phát triển khác bằng văn bản.

Nếu sau một thời gian bạn sẽ thêm phần 'lớn' tiếp theo của các mô hình mới, bạn có thể bật lại DDL tự động tạm thời và sử dụng git cục bộ để sao chép các phần mới. Sau đó quay trở lại cuộc cách mạng của riêng mình và dán các phần mới được tạo ra bởi plugin Ebean.

12

Biesior về cơ bản tổng hợp nó khá tốt. Tuy nhiên, với tư cách là người mới bắt đầu trong Play, tôi thấy rằng làm rõ hơn một chút với một ví dụ cụ thể có thể hữu ích.

Trước tiên, ví dụ sau dành cho Java.

Giả sử bạn thêm một lĩnh vực mới

public String dum_str; 

trong mô hình của bạn Dum. Sau đó, bạn sẽ cần một 2.sql dưới conf/evolutions/ như thế này:

# --- !Ups 
ALTER TABLE dum ADD COLUMN dum_str VARCHAR(255); 

# --- !Downs 
ALTER TABLE dum DROP dum_str; 

Tôi hy vọng điều này sẽ rất hữu ích.

+1

Câu trả lời hay cho người đọc tiếp, đó là ALTER TABLE dum DROP COLUMN dum_str; (xin lưu ý COLUMN). – Simon

-3

Sao lưu dưới dạng tập lệnh db hiện tại. Thực hiện các thay đổi của bạn trong mô hình Java. Hãy để Play áp dụng các thay đổi và tạo lại DB Sau đó, Khôi phục dữ liệu của bạn.

Chú ý: Không thay đổi tên trường hiện tại nếu không nó sẽ không hoạt động.

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