rake db: lược đồ: tải so với di chuyển


171

Câu hỏi rất đơn giản ở đây - nếu việc di chuyển có thể trở nên chậm chạp và cồng kềnh khi một ứng dụng trở nên phức tạp hơn và nếu chúng ta có nhiều thứ rake db:schema:loadđể gọi thay thế, thì tại sao việc di chuyển lại tồn tại?

Nếu câu trả lời ở trên là việc di chuyển được sử dụng để kiểm soát phiên bản (bản ghi từng bước thay đổi cơ sở dữ liệu), thì khi một ứng dụng trở nên phức tạp hơn và rake db:schema:loadđược sử dụng nhiều hơn thay vào đó, liệu chúng có tiếp tục duy trì chức năng chính của chúng không?


Chú ý:

Từ câu trả lời cho câu hỏi này: rake db:schema:load sẽ xóa dữ liệu trên máy chủ sản xuất, vì vậy hãy cẩn thận khi sử dụng nó.


5
+1 Tôi không bao giờ hiểu mục đích di cư; Tại sao không chỉ kiểm soát phiên bản?
thay thế

5
@alternative - Di chuyển cho phép bạn thực hiện các công cụ khác, như nếu bạn cần thêm một cột không null, bạn có thể điền thông tin vào cột đó một cách thông minh thay vì sử dụng một số giá trị mặc định.
Josh M.

Câu trả lời:


208

Di chuyển cung cấp các thay đổi bước tiến và lùi cho cơ sở dữ liệu. Trong môi trường sản xuất, các thay đổi gia tăng phải được thực hiện cho cơ sở dữ liệu trong quá trình triển khai: di chuyển cung cấp chức năng này với lỗi không an toàn. Nếu bạn chạy rake db:schema:loadtrên một máy chủ sản xuất, cuối cùng bạn sẽ xóa tất cả dữ liệu sản xuất của mình. Đây là một thói quen nguy hiểm để có được vào.

Điều đó đang được nói, tôi tin rằng đó là một thực tế tốt để thỉnh thoảng "sụp đổ" di cư. Điều này đòi hỏi phải xóa các di chuyển cũ, thay thế chúng bằng một di chuyển duy nhất (rất giống với schema.rbtệp của bạn ) và cập nhật schema_migrationsbảng để phản ánh thay đổi này. Hãy thật cẩn thận khi làm điều này! Bạn có thể dễ dàng xóa dữ liệu sản xuất của mình nếu không cẩn thận.

Là một lưu ý phụ, tôi tin tưởng mạnh mẽ rằng bạn không bao giờ nên tạo dữ liệu trong các tệp di chuyển. Các seed.rbtập tin có thể được sử dụng cho điều này, hoặc cào tùy chỉnh hoặc triển khai các nhiệm vụ. Đặt điều này vào các tệp di chuyển sẽ trộn lẫn đặc tả lược đồ cơ sở dữ liệu của bạn với đặc tả dữ liệu của bạn và có thể dẫn đến xung đột khi chạy các tệp di chuyển.


80
cảm ơn bạn đã thông báo rằng rake db: lược đồ: tải xóa tất cả dữ liệu sản xuất!
Magne

2
Thay vì thay thế các di chuyển "bị sụp đổ" bằng một di chuyển mới bắt chước lược đồ, tôi đã viết một viên đá quý để xóa chúng và nhắc nhở người dùng sử dụng db:schema:loadnếu họ cố gắng chạy db:migratevới bản cài đặt mới. @ clear_migations
Yarin

có thể là một câu trả lời rõ ràng nhưng trước khi thúc đẩy sản xuất đầu tiên, bạn có khuyên bạn chỉ nên xóa tất cả các lần di chuyển và sử dụng db.schema làm lần di chuyển đầu tiên không?
dtc

30

Chỉ tình cờ thấy bài đăng này, đó là từ lâu và không thấy câu trả lời tôi đang mong đợi.

rake db:schema:loadlà tuyệt vời cho lần đầu tiên bạn đưa một hệ thống vào sản xuất. Sau đó, bạn nên chạy di chuyển bình thường.

Điều này cũng giúp bạn làm sạch di chuyển của mình bất cứ khi nào bạn muốn, vì lược đồ có tất cả thông tin để đưa các máy khác vào sản xuất ngay cả khi bạn dọn sạch di chuyển của mình.


Vì vậy, bạn có thể "xóa" di chuyển của bạn bởi vì bạn không bao giờ phải sử dụng chúng? Nghe có vẻ như một tuyên bố kỳ quái.
Abe Petrillo

Tôi không rõ lợi ích của việc gì db:schema:loadngoài việc cạo đi vài giây một lần trong suốt chu kỳ phát triển. Bạn đã bao giờ làm việc với một ứng dụng mất hơn 30 giây để được xây dựng chưa? Tôi hiện đang làm việc trên một ứng dụng có lỗi trong các tệp di chuyển và nó sẽ không bao giờ di chuyển lên mà không có sửa lỗi hoặc chạy db:schema:loadkhiến tôi nghĩ rằng lược đồ: tải là khi có sự cố xảy ra đối với sự phát triển của ứng dụng.
Ninjaxor

Một lập luận khác mà tôi sẽ đưa ra để duy trì việc di chuyển là nhóm cốt lõi rails hướng người dùng đến instead of editing schema.rb, please use the migrations feature. Vì vậy, nếu bạn đang chạy db:schema:loadtrên một tệp được tạo tự động mà bạn không có di chuyển để tự động tạo lại, thì bạn đang thực hiện theo cách thủ công "chỉnh sửa" lược đồ và không cho phép di chuyển. Tôi ước tôi có một trích dẫn từ hướng dẫn đường ray về điều này, nhưng họ không thảo luận về lược đồ: tải, điều này làm tăng thêm sự thất vọng của tôi khi quyết định cách tiếp cận lược đồ: tính năng tải. = /
Ninjaxor

Tôi đến trang này chính xác bởi vì tôi đồng ý với điều đó. Kinh nghiệm của tôi là một khi trang web được sản xuất, việc sử dụng di chuyển để thay đổi nó sẽ an toàn hơn nhiều. Mặc dù vậy, các ý kiến ​​về sự khởi đầu của db / lược đồ.rb nêu chính xác điều ngược lại! (Tôi gặp vấn đề khi bắt đầu mọi dự án vì tôi quên đặt db / lược đồ.rb vào .gitignore ...)
user1251840

@AbePetrillo wow tôi đã bỏ lỡ ý kiến ​​này hoàn toàn. Tất nhiên là không, điều tôi muốn nói là bạn có thể dọn sạch các di chuyển đã được chạy trên tất cả các máy sản xuất nếu bạn muốn. Trong nhiều năm qua, tôi luôn giữ chúng xung quanh, nhưng câu nói "giúp bạn dọn dẹp di cư của bạn bất cứ khi nào bạn muốn" không có nghĩa là "Tôi sẽ không bao giờ phải sử dụng di chuyển". Vì vậy, khi bạn triển khai một máy mới, hãy chạy rake db:schema:loadngược lại rake db:migrate. Rồi từ đó, bạn có thể rake db:migrate.
ereslibre

9

Di chuyển cho phép bạn thêm dữ liệu vào db. nhưng db: lược đồ: tải chỉ tải lược đồ.


6

Bởi vì việc di chuyển có thể được khôi phục và cung cấp chức năng bổ sung. Ví dụ: nếu bạn cần sửa đổi một số dữ liệu như là một phần của thay đổi lược đồ thì bạn sẽ cần phải làm điều đó như một sự di chuyển.


4

Là người dùng của các ORM khác, tôi luôn thấy lạ là Rails không có tính năng 'đồng bộ hóa và cập nhật'. tức là bằng cách sử dụng tệp lược đồ (đại diện cho toàn bộ lược đồ cập nhật), đi qua cấu trúc DB hiện có và thêm / xóa các bảng, cột, chỉ mục theo yêu cầu.

Đối với tôi điều này sẽ mạnh mẽ hơn rất nhiều, ngay cả khi có thể chậm hơn một chút.


1
Nhiệm vụ di chuyển cơ sở dữ liệu với dữ liệu từ một lược đồ phức tạp sang một lược đồ khác đôi khi không tầm thường. Nó có thể không được giải quyết tự động và dữ liệu có thể không được di chuyển một cách nhất quán với một bước duy nhất. Di chuyển Rails là chủ và lược đồ là phụ thuộc. Lược đồ tự động được tạo lại với mỗi lần di chuyển nhưng không phải ngược lại.
oklas

Hướng dẫn riêng của Rails tuyên bố rõ ràng đó schemalà chủ, không phải di chuyển.
Drenmi

0

Tôi đã đăng như một bình luận, nhưng cảm thấy tốt hơn là đặt các bình luận của tệp db / lược đồ.rb ở đây:

# Note that this schema.rb definition is the authoritative source for your
# database schema. If you need to create the application database on another
# system, you should be using db:schema:load, not running all the migrations
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues).
#
# It's strongly recommended that you check this file into your version control system.

Trên thực tế, kinh nghiệm của tôi là tốt hơn là đặt các tệp di chuyển trong git chứ không phải tệp lược đồ.rb ...


0

rake db:migratethiết lập các bảng trong cơ sở dữ liệu. Khi bạn chạy lệnh di chuyển, nó sẽ tìm trong db / di chuyển / cho bất kỳ tệp ruby ​​nào và thực hiện chúng bắt đầu bằng cái cũ nhất. Có dấu thời gian ở đầu mỗi tên tệp di chuyển.

Không giống như rake db:migratechạy di chuyển chưa chạy, rake db:schema:loadtải lược đồ đã được tạo db/schema.rbvào cơ sở dữ liệu.

Bạn có thể tìm hiểu thêm về các lệnh cơ sở dữ liệu cào tại đây .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.