2015-06-11 22 views
5

Tôi đang sử dụng Liquibase 3.3.5 để cập nhật cơ sở dữ liệu của mình. Có ngữ cảnh là một cách hay để chỉ thực thi các phần cụ thể của thay đổi. Nhưng tôi không hiểu, tại sao TẤT CẢ các thay đổi được thực hiện, khi không có ngữ cảnh nào được cung cấp khi cập nhật. Hãy xem xét ví dụ sau:Tại sao tất cả các bối cảnh được thực hiện khi không được chỉ định trên cập nhật?

  • changeset A: context = kiểm tra
  • changeset B: không có bối cảnh
  • changeset C: context = prod

Vì vậy

  • thực hiện cập nhật với context = test, sẽ thực hiện changeset A + B.
  • thực hiện cập nhật với context = prod, sẽ thực thi thay đổi B + C.
  • thực hiện cập nhật không có ngữ cảnh, sẽ thực thi thay đổi A + B + C.

Đối với tôi, điều này không có ý nghĩa gì cả :).

Tôi hy vọng rằng chỉ có thay đổi B sẽ được thực hiện vì nó không xác định ngữ cảnh cụ thể.

Trong ví dụ ngữ cảnh Liquibase: http://www.liquibase.org/documentation/contexts.html ("Sử dụng ngữ cảnh cho dữ liệu thử nghiệm"), người ta nên đánh dấu các thay đổi để thử nghiệm bằng "kiểm tra" và thực thi chúng với ngữ cảnh "thử nghiệm" để áp dụng testdata. Tốt - có ý nghĩa. Nhưng

"Khi đến lúc di chuyển cơ sở dữ liệu sản xuất của bạn, không bao gồm bối cảnh" thử nghiệm "và dữ liệu thử nghiệm của bạn không được bao gồm. "

Vì vậy, nếu tôi sẽ không xác định 'test' bối cảnh khi thực hiện cập nhật sản xuất, nó sẽ thực hiện 'test' changesets là tốt, vì tôi không thể chỉ định một bối cảnh ở tất cả.

Một lần nữa, tôi hy vọng rằng rời ra thử nghiệm trên bản cập nhật thi công, sẽ chỉ thực hiện các changesets thường xuyên mà không các changesets thử nghiệm.

Hoặc tôi đang thiếu một cái gì đó ở đây :)?

Trả lời

7

đây chỉ là cách thức hoạt động Liquibase - nếu bạn cập nhật và không chỉ định ngữ cảnh, khi đó tất cả các thay đổi được coi là có thể áp dụng cho hoạt động cập nhật đó.

Có một số cách mà điều này có thể đã được triển khai và nhóm phát triển phải chọn một.

  1. nếu bạn không chỉ định ngữ cảnh trong quá trình cập nhật, thì không có thay đổi nào được xem xét.
  2. nếu bạn không chỉ định ngữ cảnh, thì tất cả các thay đổi sẽ được xem xét.
  3. nếu bạn không chỉ định ngữ cảnh, thì chỉ những thay đổi không có ngữ cảnh nào được xem xét.
  4. nếu bạn không chỉ định ngữ cảnh và không có biến thể nào có ngữ cảnh, thì tất cả các thay đổi đều được xem xét, nhưng nếu một số thay đổi có ngữ cảnh, hãy chuyển đến tùy chọn 1, 2 hoặc 3 ở trên.

Nhóm có thể đã đi với tùy chọn 3 (phù hợp với mong đợi của bạn) nhưng đã quyết định từ lâu để đi với tùy chọn 2, vì đó có vẻ là cách 'tốt nhất' vào thời điểm đó. Tôi không tham gia vào nhóm vào thời điểm đó, vì vậy tôi không biết nhiều hơn thế.

+0

Ok, cảm ơn bạn đã làm rõ :)! Thay đổi đó sẽ phá vỡ khả năng tương thích ngược, đó là chắc chắn. Nhưng với tư cách là một người dùng mới của Liquibase, điều đó không cảm thấy "tự nhiên" đối với tôi, do đó là câu hỏi. Nếu bạn luôn sử dụng ngữ cảnh, có vẻ như ok để thực hiện theo cách đó. Có kế hoạch nào để thay đổi hành vi đó không? – javg

+0

Như bạn đã lưu ý, việc thay đổi nó sẽ phá vỡ khả năng tương thích ngược, vì vậy rất khó có thể thay đổi. Nó sẽ có lợi để cải thiện tài liệu. Nếu bạn quan tâm, tài liệu là tất cả trong GitHub, và nhóm nghiên cứu hoan nghênh yêu cầu kéo! https://github.com/liquibase/liquibase.github.com ps - nếu câu trả lời của tôi hữu ích, vui lòng 'chấp nhận câu trả lời' làm câu trả lời đúng. – SteveDonie

1

Có thể đã quá muộn đối với @javg, nhưng điều này có thể mang lại lợi ích cho người đọc trong tương lai. Yêu cầu này có thể đạt được như sau:

changeset A: context=test 
changeset B: context=all 
changeset C: context=prod 

Vì vậy

executing update with "context=test,all" will execute changeset A+B. 
executing update with "context=all,prod" will execute changeset B+C. 
executing update with "context=all" will only execute changeset B as you expect. 
1

tôi sẽ bổ sung thêm giải pháp từ tôi (từ quan điểm của tôi hành vi mặc định Liquibase không phải là trực quan). Trong dự án của chúng tôi để đối phó với "vấn đề" chúng ta đã cấu bối cảnh liquibase theo cách này:

liquibase.setChangeLog("classpath*:liquibase/master.xml"); 
contexts = StringUtils.isBlank(contexts) ? "none" : contexts; 
liquibase.setContexts(contexts); 

Nó gây liquibase mà sẽ chạy tất cả các thay đổi-bộ với bối cảnh 'không' và tất cả các mặc định thay đổi-bộ (thay đổi-bộ mà không có ngữ cảnh) - vâng, đây là cách nó hoạt động.

Vì vậy, hãy chọn tên mà không ai trong nhóm của bạn sẽ không sử dụng ('none' trong trường hợp của chúng tôi) làm tên ngữ cảnh và sau đó chạy liquibase theo mặc định với ngữ cảnh đó (xem ví dụ). Với cách tiếp cận đó, bạn sẽ chạy các bộ thay đổi mà không có bất kỳ ngữ cảnh nào mà tôi cho rằng nên là phương pháp mặc định!

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