Tôi sắp hoàn thành dự án của mình. Tôi có kế hoạch lớn cho sau khi khởi chạy và cấu trúc cơ sở dữ liệu sẽ thay đổi - các cột mới trong các bảng hiện có cũng như các bảng mới và các liên kết mới với các mô hình mới và hiện có.
Tôi chưa chạm vào di chuyển trong Sequelize, vì tôi chỉ có dữ liệu thử nghiệm mà tôi không ngại xóa sạch mỗi khi cơ sở dữ liệu thay đổi.
Cuối cùng, hiện tại tôi đang chạy sync force: true
khi ứng dụng của tôi khởi động, nếu tôi đã thay đổi định nghĩa mô hình. Điều này xóa tất cả các bảng và làm cho chúng từ đầu. Tôi có thể bỏ qua force
tùy chọn để chỉ tạo các bảng mới. Nhưng nếu những cái hiện có đã thay đổi thì điều này không hữu ích.
Vì vậy, một khi tôi thêm vào di chuyển, làm thế nào để mọi thứ hoạt động? Rõ ràng tôi không muốn các bảng hiện có (có dữ liệu trong đó) bị xóa sạch, vì vậy sync force: true
không có vấn đề gì. Trên các ứng dụng khác, tôi đã giúp phát triển (Laravel và các khung công tác khác) như một phần của quy trình triển khai ứng dụng, chúng tôi chạy lệnh di chuyển để chạy mọi di chuyển đang chờ xử lý. Nhưng trong các ứng dụng này, lần di chuyển đầu tiên có cơ sở dữ liệu bộ xương, với cơ sở dữ liệu ở trạng thái sớm phát triển - phiên bản alpha đầu tiên hoặc bất cứ điều gì. Vì vậy, ngay cả một phiên bản của ứng dụng muộn cho bữa tiệc cũng có thể tăng tốc trong một lần, bằng cách chạy tất cả các lần di chuyển theo trình tự.
Làm cách nào để tạo "di chuyển đầu tiên" như vậy trong Sequelize? Nếu tôi không có, một phiên bản mới của ứng dụng theo cách nào đó sẽ không có cơ sở dữ liệu bộ xương để chạy di chuyển hoặc nó sẽ chạy đồng bộ hóa khi bắt đầu và sẽ làm cho cơ sở dữ liệu ở trạng thái mới với tất cả các bảng mới, v.v., nhưng sau đó khi nó cố gắng chạy các di chuyển, chúng sẽ không có ý nghĩa, vì chúng được viết với cơ sở dữ liệu ban đầu và mỗi lần lặp lại liên tiếp trong tâm trí.
Quá trình suy nghĩ của tôi: ở mọi giai đoạn, cơ sở dữ liệu ban đầu cộng với mỗi lần di chuyển theo trình tự sẽ bằng (cộng hoặc trừ dữ liệu) cơ sở dữ liệu được tạo khi sync force: true
chạy. Điều này là do các mô tả mô hình trong mã mô tả cấu trúc cơ sở dữ liệu. Vì vậy, có thể nếu không có bảng di chuyển, chúng tôi chỉ chạy đồng bộ hóa và đánh dấu tất cả các lần di chuyển là xong, mặc dù chúng không chạy. Đây có phải là những gì tôi cần làm (làm thế nào?), Hoặc là Sequelize phải tự làm điều này, hay tôi đang sủa sai cây? Và nếu tôi ở đúng khu vực, chắc chắn sẽ có một cách hay để tự động tạo ra hầu hết việc di chuyển, dựa trên các mô hình cũ (bằng cách băm xác thực? Hoặc thậm chí mỗi lần di chuyển có thể được gắn với một cam kết không? Tôi thừa nhận tôi đang nghĩ trong một vũ trụ trung tâm không di động) và các mô hình mới. Nó có thể làm khác cấu trúc và tạo các lệnh cần thiết để chuyển đổi cơ sở dữ liệu từ cũ sang mới và sau đó, nhà phát triển có thể đi vào và thực hiện bất kỳ chỉnh sửa cần thiết nào (xóa / chuyển dữ liệu cụ thể, v.v.).
Khi tôi chạy nhị phân tuần tự với --init
lệnh, nó sẽ cho tôi một thư mục di chuyển trống. Khi tôi chạy sequelize --migrate
nó làm cho tôi một bảng SequelizeMeta không có gì trong đó, không có bảng nào khác. Rõ ràng là không, bởi vì nhị phân đó không biết cách khởi động ứng dụng của tôi và tải các mô hình.
Chắc chắn là tôi đang thiếu gì đó.
TLDR: làm cách nào để thiết lập ứng dụng của tôi và quá trình di chuyển của nó để có thể cập nhật các phiên bản khác nhau của ứng dụng trực tiếp, cũng như một ứng dụng hoàn toàn mới không có cơ sở dữ liệu bắt đầu?
sync
bây giờ, ý tưởng là việc di chuyển "tạo ra" toàn bộ cơ sở dữ liệu, do đó việc dựa vào bộ xương là một vấn đề. Chẳng hạn, quy trình làm việc của Ruby on Rails, sử dụng Di chuyển cho mọi thứ và thật tuyệt vời khi bạn đã quen với nó. Chỉnh sửa: Và vâng, tôi nhận thấy câu hỏi này khá cũ, nhưng vì chưa bao giờ có câu trả lời thỏa đáng và mọi người có thể đến đây để tìm hướng dẫn, tôi nghĩ rằng tôi nên đóng góp.