Mất lược đồ của tôi.rb! Nó có thể được tái sinh?


133

Do một số vấn đề triển khai, tôi đã dừng theo dõi lược đồ.rb trong git. Bằng cách nào đó tôi đã nhét cái này lên và ở đâu đó trên đường đi, tệp giản đồ.rb của tôi đã biến mất.

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

Câu trả lời:


230

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

bundle exec rake db:schema:dump

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ỉ) vì vậy hãy đánh dấu cho bạn. Chỉ tò mò, điều này tạo ra lược đồ từ chính cơ sở dữ liệu hoặc từ các lần di chuyển?
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 việc di chuyển.
mguymon

1
lược đồ.rb vẫn chứa lược đồ trống sau khi rake db:schema:dumptrên đường ray 2.0
Will Hardwick-Smith

Tệp lược đồ.rb của tôi vẫn giữ nguyên chính xác sau khi chạy các lệnh trên
stevec

59

Cẩn thận,

rake db:schema:dump

sẽ kết xuất lược đồ DB hiện tại 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 việc di chuyển của mình, chúng sẽ KHÔNG được phản ánh trong tệp lược đồ.rb không phải là những gì bạn muốn IMO.

Nếu bạn muốn tạo lại lược đồ từ các lần di chuyển, hãy làm như sau:

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

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

4
Mỗi bức tranh đượ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 đồ: đổ và không nhận được một lược đồ sạch. OP đang nói về việc theo dõi lược đồ trong CVS. Tôi muốn để lược đồ của mình phù hợp với các định nghĩa trong quá trình di chuyển của tôi và không phải là phiên bản lỗi thời từ DB sản xuất hoặc DB phát triển cũ
gamov

11
rake db:schema:dump

Tôi nghĩ rằng đ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.


8

RAILS 5 cách:

rails db:schema:dump

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

bundle exec rails db:schema:dump

Ghi chú:

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


5

Nếu bạn tái sinh schema.rbtại địa phương, bạn sẽ ổn thôi. Nó chỉ đơn giản là đại diện cho cấu trúc của các bảng cơ sở dữ liệu của bạn. Dữ liệu không được chứa trong tập tin này.

Để tạo lại schema.rbtệp của bạn , hãy chạy:

bundle exec rake db:schema:dump

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


4

Trực tiếp từ chính tệp lược đồ.rb:

Nếu bạn cần tạo cơ sở dữ liệu ứng dụng trên một hệ thống khác, bạn nên sử dụng db:schema:load, không chạy tất cả các lần 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 (bạn sẽ di chuyển càng nhiều, nó sẽ chạy càng chậm và khả năng gặp vấn đề càng lớn).

Vì vậy, KHÔNG làm đề 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.


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

1

Tôi cũng gặp vấn đề tương tự khi lược đồ cũ của tôi không được 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à bỏ tất cả các bảng hiện có trong cơ sở dữ liệu và di chuyển chúng một lần nữa. Sau đó, chạy lệnh "db: giản đồ: tải" đã cho tôi một lược đồ mới.rb.

drop table my_table_name // deleted them individually
rake db:migrate
rake db:schema:dump // re-created a new schema
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.