2010-07-27 28 views
40

Trong đó tôi có nghĩa là "rebasing" trong từ điển, chứ không phải là định nghĩa git ...rebase Rails di cư trong một dự án dài chạy

Tôi có một lớn, dài chạy dự án Rails rằng có khoảng 250 di cư, đó là nhận được một liên lạc khó sử dụng để quản lý tất cả những điều này.

Điều đó nói rằng, tôi cần một cơ sở để từ đó thanh lọc và xây dựng lại cơ sở dữ liệu của mình khi chạy thử nghiệm. Vì vậy, dữ liệu chứa trong những điều này là quan trọng.

Có ai có bất kỳ chiến lược nào để nói hay không, bán phá giá lược đồ tại một điểm đã đặt - lưu trữ tất cả các di chuyển cũ và bắt đầu lại với các di chuyển mới. Rõ ràng tôi có thể sử dụng lược đồ rake: dump - nhưng thực sự tôi cần một cách mà db: di chuyển sẽ tải lược đồ đầu tiên và sau đó bắt đầu chạy phần còn lại của di chuyển.

Tôi muốn tiếp tục sử dụng di chuyển vì chúng rất hữu ích trong phát triển, tuy nhiên, không có cách nào tôi quay lại và chỉnh sửa di chuyển từ năm 2007 để có vẻ ngớ ngẩn để giữ nó.

Trả lời

46

Nói chung, bạn không cần phải dọn sạch di chuyển cũ. Nếu bạn đang chạy db: di chuyển từ đầu (không có db hiện có), Rails sử dụng db/schema.rb để tạo các bảng thay vì chạy mọi lần di chuyển. Nếu không, nó chỉ chạy các di chuyển cần thiết để nâng cấp từ lược đồ hiện tại lên phiên bản mới nhất.

Nếu bạn vẫn muốn kết hợp di cư lên đến một điểm nhất định vào một duy nhất, bạn có thể thử:

  • di chuyển từ đầu lên đến giản đồ mục tiêu sử dụng rake db:migrate VERSION=xxx
  • đổ schema sử dụng rake db:schema:dump
  • xóa di chuyển từ đầu đến phiên bản xxx và tạo một lần di chuyển mới bằng nội dung của db/schema.rb (đặt câu lệnh create_table và add_index vào phương thức self.up của di chuyển mới).

Đảm bảo chọn một trong các số phiên bản di chuyển cũ cho di chuyển mới tổng hợp của bạn; nếu không, Rails sẽ cố gắng áp dụng di chuyển đó trên máy chủ sản xuất của bạn (sẽ xóa sạch dữ liệu hiện có của bạn, vì các câu lệnh create_table sử dụng: force⇒true).

Dù sao, tôi sẽ không khuyên bạn nên làm điều này vì Rails thường xử lý chính việc di chuyển tốt. Nhưng nếu bạn vẫn muốn, hãy chắc chắn kiểm tra kỹ mọi thứ và thử cục bộ trước khi bạn có nguy cơ mất dữ liệu trên máy chủ sản xuất của mình.

+3

Bạn nhận ra t mũ này chỉ hoạt động nếu không có dữ liệu được thêm vào trong di chuyển của bạn? schema.rb không lưu trữ bất kỳ dữ liệu nào được tạo trong quá trình di chuyển. – weexpectedTHIS

+4

@weexpectedTHIS đó là lý do tại sao bạn không nên chạm vào dữ liệu khi di chuyển. – Scottymeuk

+0

@scottymeuk thì làm cách nào bạn đề xuất triển khai thay đổi đối với dữ liệu – weexpectedTHIS

1

Ngoài câu trả lời được cung cấp (cũng cho biết cách hợp nhất khối lượng di chuyển của bạn), bạn cho biết một mối quan tâm để xóa dữ liệu (mà tôi giả định là được thêm theo cách thủ công sau khi đồ đạc điền bảng của bạn); mà bạn đang phụ thuộc vào làm mới một trạng thái dữ liệu ban đầu. Một số dự án thực sự yêu cầu sàng lọc chuyên sâu dữ liệu cơ bản, tái thiết và tái phân bổ các bảng. Chúng ta phụ thuộc rất nhiều vào việc thực thi lặp đi lặp lại các hoạt động này và tôi thấy rằng nếu bạn có thể giảm hoàn toàn lược đồ của mình sang các câu lệnh SQL, các bảng của bạn sẽ xây dựng lại nhanh hơn rất nhiều so với cú pháp của Ruby.

Một sự giúp đỡ hơn nữa tầm thường trong xây dựng lại bảng của bạn là để dành một cửa sổ terminal riêng một tuyên bố lệnh kết hợp duy nhất:

rake db: thả db: tạo db: schema: db tải: đồ đạc: tải

Mỗi lần bạn cần xây dựng lại và điền lại các bảng của mình, một mũi tên lên và nhấn phím trở lại sẽ nhận được công việc thường xuyên đó. Nếu không có xung đột trong các câu lệnh SQL thực thi, và nếu bạn không có di chuyển thêm để chạy trong khi dự án của bạn đang trong trạng thái phát triển, các câu lệnh SQL sẽ thực thi có lẽ tốt hơn gấp hai lần cú pháp Ruby. Bảng của chúng tôi xây dựng lại và tái phổ biến trong 20 giây theo cách này, ví dụ, trong khi cú pháp Ruby làm tăng quá trình lên hơn 50 giây. Nếu bạn đang chờ đợi dữ liệu đó để làm mới để thực hiện công việc tiếp theo (đặc biệt là nhiều lần), điều này tạo ra sự khác biệt lớn trong quy trình làm việc.

3

Để tự động sáp nhập (hoặc squashing) của di cư, bạn có thể sử dụng Squasher gem

Đơn giản chỉ cần cài đặt

gem install squasher 

Và chạy với một ngày, và sự di cư trước ngày đó sẽ được sáp nhập:

squasher 2016 # => Will merge all migration created before 2016 

Chi tiết khác in the README

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