2012-04-05 36 views
7

Tôi đang đánh giá Liquibase và cố gắng tìm hiểu xem nó có bất kỳ lợi thế nào cho việc di chuyển dữ liệu qua chỉ sử dụng các tập lệnh SQL hay không. Giả sử tôi đang làm như sau:Bất kỳ ưu điểm nào khi sử dụng Liquibase để di chuyển cơ sở dữ liệu?

phiên bản cơ sở dữ liệu 0 schema của tôi trông như thế này:

CREATE TABLE `Person` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `firstName` varchar(255) NOT NULL, 
    `lastName` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`) 
); 

Cơ sở dữ liệu được phổ biến với một số dữ liệu hiện có đại diện bởi các chèn sau:

INSERT INTO `Person` (`id`, `firstName`, `lastName`) VALUES (1, 'foo', 'bar'); 

tôi sau đó quyết định thêm cột khác vào bảng Person không phải là null nhưng tôi không muốn mất bất kỳ dữ liệu hiện có nào. Tập lệnh di chuyển từ phiên bản 0 sang phiên bản 1 sẽ trông giống như sau:

ALTER TABLE `Person` ADD COLUMN `dob` date DEFAULT NULL; 

UPDATE `Person` set `dob` = '1970-01-01'; 

ALTER TABLE `Person` MODIFY COLUMN `dob` NOT NULL; 

Liquibase có thể làm cho trường hợp sử dụng này dễ dàng hơn không?

Trả lời

2

Tôi đã trải qua cùng một điều gần đây. Xem: Adding a non-nullable column to existing table fails. Is the "value" attribute being ignored?

Không có cách nào (trong một câu lệnh SQL) để thêm cột có giá trị cho các hàng hiện có mà không đặt giá trị mặc định của cột. Vì vậy, nếu bạn muốn các hàng hiện có có một giá trị khác với các hàng mới được thêm vào (bao gồm cả nếu bạn không muốn một giá trị mặc định trên cột), bạn sẽ cần ít nhất hai câu lệnh SQL. Vì vậy, sử dụng liquibase bạn vẫn sẽ cần phải thêm cột này trong ba bước bạn mô tả.

Vì vậy, câu trả lời của tôi cho câu hỏi của bạn là: Có những lợi thế của việc sử dụng liquibase qua việc duy trì một loạt các tập lệnh SQL. Nhưng đây không phải là một trong số họ. :)

+0

Cảm ơn bạn đã liên kết đến câu hỏi/câu trả lời của mình, điều đó giúp ích. –

+0

Tất nhiên bạn có thể thêm một cột không rỗng với một mặc định trong "SQL". DBMS nào bạn đang đề cập đến không hỗ trợ điều này? –

+0

@a_horse_with_no_name - Xin lỗi, phải rõ ràng Ý tôi là: Không có lệnh SQL nào có thể tạo một cột không có giá trị chỉ định giá trị cho các hàng hiện có nhưng không đặt giá trị cột mặc định. Tôi rất vui khi được chứng minh là sai nhưng tôi nghĩ rằng tất cả các kết hợp của lệnh để đạt được điều này có ít nhất 3 dòng. – David

5

Điều chính liquibase mang lại cho bạn là khả năng theo dõi những thay đổi nào đã được áp dụng cho cơ sở dữ liệu nào. Trong ví dụ của bạn, SQL bạn đang liệt kê sẽ chính xác những gì liquibase sẽ làm, nhưng nó sẽ có thể biết rằng cơ sở dữ liệu dev của bạn đang ở phiên bản Y và khi bạn "cập nhật" cơ sở dữ liệu của bạn, nó sẽ chỉ áp dụng một cặp vợ chồng thay đổi mới trong khi sản xuất trên phiên bản X và khi bạn "cập nhật" sản xuất, nó sẽ áp dụng nhiều thay đổi hơn.

Lưu ý: các tuyến đường lỏng thay đổi độc lập thay vì sử dụng một phiên bản duy nhất để hỗ trợ nhiều nhà phát triển và/hoặc các chi nhánh mã.

Ngoài việc theo dõi những thay đổi áp dụng, ưu điểm khác liquibase sẽ cung cấp cho bạn bao gồm:

  • Khả năng có mô tả sự thay đổi tương tự trên nhiều loại cơ sở dữ liệu.
  • Khả năng có/sau đó logic trong những gì được áp dụng.
  • Tài liệu được tạo của lịch sử cơ sở dữ liệu.
  • Khả năng chỉ định các thay đổi phức tạp, nhiều câu lệnh dễ dàng hơn.
+0

Bạn có nghĩa là "Khả năng có cùng một mô tả thay đổi trên nhiều loại cơ sở dữ liệu"? Điều đó nghĩa là gì? Tại sao bạn muốn có cùng một mô tả? –

+0

Ví dụ, nếu ứng dụng của bạn hỗ trợ cả MySQL và Postgres, bạn có thể viết một thay đổi duy nhất có thể được thực hiện đối với cả hai kiểu cơ sở dữ liệu –

+0

Ah vâng, tôi nghĩ từ "mô tả" đã ném tôi. Tôi đã nghĩ đến một mô tả bằng tiếng Anh về sự thay đổi thay vì một mô tả chung. –

0

Mite mang đến cho bạn cả hai thế giới theo ý kiến ​​của tôi. Bạn có thể tiếp tục sử dụng kịch bản sql của bạn và nó quản lý có hay không có một kịch bản đã được thực hiện trên cơ sở dữ liệu và cung cấp cho bạn khả năng lên và xuống tương tự của di chuyển dựa trên đường ray thông thường hoặc Liquibase.

Hãy cho tôi biết suy nghĩ của bạn.

https://github.com/soitgoes/mite

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