ทำ schema.rb ของฉันหาย! สามารถสร้างใหม่ได้หรือไม่?


136

เนื่องจากปัญหาการปรับใช้บางอย่างฉันจึงหยุดติดตาม schema.rb ใน git อย่างไรก็ตามฉันได้ยัดมันขึ้นมาและบางแห่งระหว่างทางไฟล์ schema.rb ของฉันหายไป

มีวิธีสร้าง schema.rb จากฐานข้อมูลหรือจากการโอนย้ายหรือไม่ ฉันไม่ต้องการให้ข้อมูลที่มีอยู่สูญหาย

คำตอบ:


234

หากคุณเรียกใช้rake -Tมันจะแสดงรายการงานคราดที่เป็นไปได้ทั้งหมดสำหรับโครงการ Rails ของคุณ หนึ่งในนั้นคือdb: schema: dumpซึ่งจะสร้าง schema.rb ขึ้นใหม่สำหรับแอป Rails จากฐานข้อมูล

bundle exec rake db:schema:dump

ขอบคุณมากคำตอบมากมาย แต่ดูเหมือนว่าคุณจะเป็นคนแรก (เฉยๆ) จึงทำเครื่องหมายให้คุณ แค่อยากรู้อยากเห็นสิ่งนี้สร้างสคีมาจากฐานข้อมูลเองหรือจากการโยกย้าย?
brad

7
จากฐานข้อมูลเองดังนั้นโปรดใช้ความระมัดระวังหากมีการเปลี่ยนแปลงเกิดขึ้นนอกการย้ายข้อมูล
mguymon

1
schema.rb ยังคงมี schema ว่างหลังจากrake db:schema:dumpบนราง 2.0
Will Hardwick-Smith

ไฟล์ schema.rb ของฉันยังคงเหมือนเดิมทุกประการหลังจากเรียกใช้คำสั่งข้างต้น
stevec

60

ระวัง

rake db:schema:dump

จะถ่ายโอนคีมาฐานข้อมูลปัจจุบันจากฐานข้อมูล ซึ่งหมายความว่าหากคุณทำการเปลี่ยนแปลงใด ๆ กับการย้ายข้อมูลของคุณการย้ายข้อมูลจะไม่ปรากฏในไฟล์ schema.rb ซึ่งไม่ใช่สิ่งที่คุณต้องการ IMO

หากคุณต้องการสร้างสคีมาใหม่จากการย้ายข้อมูลให้ทำดังต่อไปนี้:

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

1
นั่นจะทำให้สูญเสียข้อมูลซึ่ง OP กล่าวว่าพวกเขาต้องการหลีกเลี่ยง นอกจากนี้ตามที่ Colin ชี้ให้เห็นการสร้างฐานข้อมูลใหม่ทั้งหมดจากการย้ายข้อมูลอาจเป็นความคิดที่ไม่ดีมากเนื่องจากมีความเป็นไปได้ที่เพิ่มขึ้นในการพบปัญหาการพึ่งพาแปลก ๆ (โดยทั่วไปจะพูด) หากมีการโอนย้ายที่รอดำเนินการเป็นไปได้ดีที่จะเรียกใช้การย้ายข้อมูลล่าสุดเหล่านั้นบนเครื่องพัฒนาจากนั้นรันrake db:schema:dumpคำสั่ง
Paul Richter

4
ผ้าใบทุกผืนมีคำอธิบายอย่างชัดเจนในคำตอบของฉัน ฉันถูกกัดอย่างแน่นอนโดยใช้เฉพาะ schema: dump และไม่ได้รับสคีมาที่สะอาด OP กำลังพูดถึงการติดตามสคีมาใน CVS ฉันต้องการให้สคีมาของฉันสอดคล้องกับคำจำกัดความของฉันในการย้ายข้อมูลไม่ใช่เวอร์ชันที่ล้าสมัยจากฐานข้อมูลที่ใช้งานจริงหรือฐานข้อมูลการพัฒนาเก่า
gamov

12
rake db:schema:dump

ฉันคิดว่าสิ่งนี้ยังใช้ได้ใน Rails 3 - มันสร้าง schema.rb ขึ้นมาใหม่จากฐานข้อมูล


9

ทางรถไฟ 5 ทาง:

rails db:schema:dump

หรือถ้าคุณเจอGem :: LoadErrorแล้ว:

bundle exec rails db:schema:dump

บันทึก:

ในราง 5 ก็จะแนะนำว่างานจะมีการสร้าง / ดำเนินการโดยใช้railsแทนการrakeนี้เป็นเพียงการจำรางสร้างงานที่มีส่วนขยายเห็นใน.rake lib/tasks/myTask.rakeซึ่งหมายความว่างานเหล่านี้สามารถดำเนินการได้โดยการสั่งrakeล่วงหน้า


6

ถ้าคุณสร้างใหม่schema.rbในเครื่องคุณก็น่าจะโอเค เป็นเพียงการแสดงโครงสร้างของตารางฐานข้อมูลของคุณ ข้อมูลเองไม่มีอยู่ในไฟล์นี้

ในการสร้างschema.rbไฟล์ของคุณใหม่ให้เรียกใช้:

bundle exec rake db:schema:dump

จากนั้นก็คอมมิตschema.rbไฟล์ใหม่และคุณจะต้องมีรูปร่างที่ดี!


5

โดยตรงจากไฟล์ schema.rb เอง:

หากคุณต้องการสร้างฐานข้อมูลแอปพลิเคชันบนระบบอื่นคุณควรใช้db:schema:loadไม่ใช่เรียกใช้การย้ายทั้งหมดตั้งแต่เริ่มต้น วิธีนี้เป็นแนวทางที่มีข้อบกพร่องและไม่ยั่งยืน (ยิ่งคุณสะสมการโยกย้ายมากเท่าไหร่ก็จะทำงานช้าลงและมีโอกาสเกิดปัญหามากขึ้น)

ดังนั้นอย่าทำตามคำแนะนำrake db:migrateซึ่งแนะนำใน - ในขณะที่เขียนนี้ - คำตอบที่ได้คะแนนต่ำสุด


คุณอาจต้องการเรียกใช้การย้ายข้อมูลที่รอดำเนินการสองสามรายการสุดท้ายหากมีอยู่ในเครื่องพัฒนาของคุณก่อนที่จะสร้างสคีมาใหม่ แต่ใช่การสร้างฐานข้อมูลใหม่จากการย้ายข้อมูลเป็นความคิดที่ไม่ดีโดยเฉพาะอย่างยิ่งเนื่องจากจะทำให้ข้อมูลสูญหาย
Paul Richter

2

ฉันมีปัญหาคล้ายกันที่สคีมาเก่าของฉันไม่รีเฟรชแม้ว่าฉันจะลบการย้ายข้อมูล

ดังนั้นสิ่งที่ฉันทำคือทิ้งตารางที่มีอยู่ทั้งหมดในฐานข้อมูลและย้ายข้อมูลอีกครั้ง จากนั้นการรันคำสั่ง "db: schema: load" ทำให้ฉันมี schema.rb ใหม่

drop table my_table_name // deleted them individually
rake db:migrate
rake db:schema:dump // re-created a new schema
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.