2012-03-16 16 views
108

Do một số vấn đề triển khai, tôi đã ngừng theo dõi schema.rb trong git. Bằng cách nào đó tôi đã nhồi này lên và một nơi nào đó dọc theo cách tập tin schema.rb của tôi đã biến mất.Mất schema.rb của tôi! Nó có thể được tái sinh không?

Có cách nào tạo lại lược đồ.rb từ cơ sở dữ liệu hoặc từ quá trình di chuyển không? Tôi không muốn mất dữ liệu hiện có.

Trả lời

174

Nếu bạn chạy rake -T, nó sẽ liệt kê tất cả các tác vụ cào có thể có cho dự án Rails của bạn. Một trong số đó là db: schema: dump sẽ tạo lại schema.rb cho ứng dụng Rails từ cơ sở dữ liệu.

bundle exec rake db:schema:dump 
+0

Cảm ơn rất nhiều, nhiều câu trả lời nhưng có vẻ như bạn là người đầu tiên (chỉ) để đánh dấu vào bạn. Chỉ cần tò mò, liệu điều này có tạo ra lược đồ từ chính cơ sở dữ liệu hoặc từ việc di chuyển không? – brad

+7

Từ chính cơ sở dữ liệu, vì vậy hãy cẩn thận nếu có những thay đổi xảy ra bên ngoài di chuyển. – mguymon

+1

schema.rb vẫn chứa lược đồ rỗng sau khi 'rake db: schema: dump' trên đường ray 2.0 –

11
rake db:schema:dump 

Tôi nghĩ điều này vẫn còn hợp lệ trong Rails 3 - nó tạo lại lược đồ.rb từ cơ sở dữ liệu.

3

Nếu bạn tạo lại schema.rb tại địa phương, bạn sẽ không sao. Nó chỉ đơn giản là giữ một biểu diễn cấu trúc của các bảng cơ sở dữ liệu của bạn. Bản thân dữ liệu không có trong tệp này.

Để tái tạo tập tin schema.rb của bạn, hãy chạy:

bundle exec rake db:schema:dump 

Sau đó chỉ cần cam kết schema.rb tập tin mới và bạn phải ở trong tình trạng tốt!

46

cẩn thận,

rake db:schema:dump 

sẽ đổ schema DB hiện TỪ DB. Điều này có nghĩa là nếu bạn thực hiện bất kỳ thay đổi nào đối với di chuyển của mình, chúng sẽ NOT được phản ánh trong tệp schema.rb không phải là những gì bạn muốn IMO.

Nếu bạn muốn tái tạo giản đồ từ sự di cư, làm như sau:

rake db:drop # ERASES THE DATABASE !!!! 
rake db:create 
rake db:migrate 
+0

Điều đó sẽ dẫn đến mất dữ liệu mà OP cho biết họ muốn tránh. Ngoài ra, như Colin chỉ ra, tái tạo cơ sở dữ liệu hoàn toàn từ việc di chuyển có khả năng là một ý tưởng rất xấu vì khả năng gia tăng chạy vào các vấn đề phụ thuộc lẻ (nói chung). Nếu có di chuyển đang chờ xử lý, có khả năng là tốt nhất để chạy những di chuyển cuối cùng này trên máy phát triển, và sau đó chạy lệnh 'rake db: schema: dump'. –

+2

Mọi canvas đều được giải thích rõ ràng trong câu trả lời của tôi. Tôi đã bị cắn CHÍNH XÁC bằng cách chỉ chạy lược đồ: dump và không nhận được lược đồ rõ ràng. OP đang nói về việc theo dõi lược đồ trong một CVS. Tôi muốn có lược đồ của tôi phù hợp với định nghĩa của tôi trong di chuyển của tôi và không phải là một phiên bản lỗi thời từ DB sản xuất hoặc phát triển cũ DB – gamov

3

Trực tiếp từ tập tin schema.rb bản thân:

Nếu bạn cần để tạo ra các ứng dụng cơ sở dữ liệu trên hệ thống khác, bạn nên sử dụng db:schema:load, không chạy tất cả các di chuyển từ đầu. Cách thứ hai là một cách tiếp cận thiếu sót và không bền vững (di chuyển nhiều hơn bạn sẽ tích lũy, nó sẽ chạy chậm hơn và khả năng lớn hơn cho các vấn đề).

Vì vậy, KHÔNG thực hiện đề xuất rake db:migrate, được đề xuất trong - tại thời điểm viết bài này - câu trả lời được xếp hạng thấp nhất.

+0

Bạn có thể muốn chạy vài lần di chuyển đang chờ xử lý nếu có trên máy phát triển của bạn trước khi tạo lại lược đồ, nhưng có tái tạo cơ sở dữ liệu hoàn toàn từ việc di chuyển là một ý tưởng rất xấu, đặc biệt là vì điều đó sẽ dẫn đến mất dữ liệu. –

0

Tôi cũng gặp sự cố tương tự khi sơ đồ cũ của tôi không làm mới ngay cả khi tôi đã xóa di chuyển.

Vì vậy, những gì tôi đã làm là xóa tất cả các bảng hiện có trong cơ sở dữ liệu và di chuyển chúng lại. Sau đó chạy lệnh "db: schema: load" cho tôi một schema.rb mới.

drop table my_table_name // deleted them indivisully 
rake db:migrate 
rake db:schema:dump // re-created a new schema 
2

RAILS 5 Way:

rails db:schema:dump 

hoặc nếu bạn Encounter Gem :: LoadError thì:

bundle exec rails db:schema:dump 

Lưu ý:

trong đường ray 5 đề nghị rằng nhiệm vụ được tạo ra/thực hiện bằng cách sử dụng rails thay vì rake, đây chỉ là để ghi nhớ, nhiệm vụ tạo ra đường ray có phần mở rộng .rake xem trong lib/tasks/myTask.rake. có nghĩa là các tác vụ này cũng có thể được thực hiện bằng cách thêm vào trước rake.

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