rake db: schema: load vs. migrations


171

คำถามง่ายๆที่นี่ - หากการย้ายข้อมูลช้าและยุ่งยากเนื่องจากแอปมีความซับซ้อนมากขึ้นและถ้าเรามีการrake db:schema:loadโทรที่สะอาดกว่าแทนทำไมการย้ายข้อมูลจึงมีอยู่ทั้งหมด

หากคำตอบข้างต้นคือการย้ายข้อมูลจะใช้สำหรับการควบคุมเวอร์ชัน (บันทึกการเปลี่ยนแปลงฐานข้อมูลแบบขั้นตอน) จากนั้นเมื่อแอปมีความซับซ้อนมากขึ้นและrake db:schema:loadมีการใช้งานมากขึ้นแทนพวกเขายังคงใช้งานฟังก์ชันหลักต่อไปหรือไม่


ข้อควรระวัง:

จากคำตอบสำหรับคำถามนี้: rake db:schema:load จะลบข้อมูลบนเซิร์ฟเวอร์ที่ใช้งานจริงดังนั้นโปรดใช้ความระมัดระวัง


5
+1 ฉันไม่เข้าใจวัตถุประสงค์ของการย้ายถิ่น ทำไมไม่เพียงแค่เวอร์ชันควบคุมสคีมา?
ทางเลือก

5
@alternative - การย้ายข้อมูลช่วยให้คุณสามารถทำสิ่งอื่น ๆ ได้เช่นถ้าคุณต้องการเพิ่มคอลัมน์ที่ไม่เป็นค่าว่างคุณสามารถกรอกข้อมูลในคอลัมน์นั้นได้อย่างชาญฉลาดแทนที่จะใช้ค่าเริ่มต้น
Josh M.

คำตอบ:


208

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

ที่ถูกกล่าวว่าฉันเชื่อว่ามันเป็นวิธีที่ดีในการโยกย้าย "ยุบ" เป็นครั้งคราว การทำเช่นนี้จะเป็นการลบการย้ายข้อมูลเก่าแทนที่ด้วยการโยกย้ายครั้งเดียว (คล้ายกับschema.rbไฟล์ของคุณ) และอัปเดตschema_migrationsตารางเพื่อแสดงการเปลี่ยนแปลงนี้ ระวังให้มากเมื่อทำเช่นนี้! คุณสามารถลบข้อมูลการผลิตของคุณได้อย่างง่ายดายหากคุณไม่ระวัง

ในฐานะที่เป็นข้อความด้านข้างฉันเชื่ออย่างยิ่งว่าคุณไม่ควรสร้างข้อมูลในไฟล์การโยกย้าย seed.rbไฟล์สามารถใช้สำหรับการนี้หรือคราดที่กำหนดเองหรือการปรับใช้งาน การนำสิ่งนี้ไปใช้ในไฟล์การโยกย้ายจะเป็นการผสมผสานข้อกำหนดสคีมาฐานข้อมูลกับสเปคข้อมูลของคุณและสามารถนำไปสู่ข้อขัดแย้งเมื่อเรียกใช้ไฟล์การย้าย


80
ขอบคุณสำหรับการแจ้งว่า rake db: schema: load ลบข้อมูลการผลิตทั้งหมด!
Magne

2
แทนที่จะแทนที่การโยกย้ายแบบ "ยุบ" ด้วยรูปแบบใหม่ที่เลียนแบบสคีมาฉันเขียนพลอยที่เพิ่งล้างออกและแจ้งให้ผู้ใช้ใช้db:schema:loadหากพวกเขาพยายามเรียกใช้db:migrateการติดตั้งใหม่ @ clear_migrations
Yarin

อาจเป็นคำตอบที่ชัดเจน แต่ก่อนที่จะผลักดันการผลิตครั้งแรกคุณจะแนะนำเพียงแค่ลบการโยกย้ายทั้งหมดและใช้ db.schema เป็นการโยกย้ายครั้งแรก?
dtc

30

เพิ่งสะดุดกับโพสต์นี้นานมาแล้วและไม่เห็นคำตอบที่ฉันคาดหวัง

rake db:schema:loadดีเยี่ยมเป็นครั้งแรกที่คุณวางระบบในการผลิต หลังจากนั้นคุณควรเรียกใช้การย้ายข้อมูลตามปกติ

นอกจากนี้ยังช่วยให้คุณทำความสะอาดการย้ายข้อมูลของคุณได้ทุกเมื่อที่ต้องการเนื่องจากสคีมามีข้อมูลทั้งหมดที่จะนำเครื่องอื่นมาใช้ในการผลิตแม้ว่าคุณจะล้างข้อมูลการย้ายข้อมูลก็ตาม


ดังนั้นคุณสามารถ "ชำระล้าง" การย้ายข้อมูลของคุณเพราะคุณไม่จำเป็นต้องใช้หรือไม่ เสียงเหมือนคำสั่งที่แปลกประหลาด
Abe Petrillo

มันไม่ชัดเจนสำหรับฉันว่าประโยชน์ที่ได้รับdb:schema:loadนอกเหนือจากการโกนทิ้งสักสองสามครั้งในรอบการพัฒนา คุณเคยทำงานกับแอพที่ใช้เวลาสร้างนานกว่า 30 วินาทีหรือไม่? ขณะนี้ฉันกำลังทำงานกับแอพที่มีข้อบกพร่องอยู่ในไฟล์การโยกย้ายและมันจะไม่โยกย้ายขึ้นโดยไม่ต้องมีการแก้ไขข้อบกพร่องหรือการทำงานdb:schema:loadซึ่งทำให้ฉันคิดว่าสคีมา: โหลดสำหรับบางสิ่งที่ผิดพลาดเกี่ยวกับการพัฒนาแอป
Ninjaxor

instead of editing schema.rb, please use the migrations featureอาร์กิวเมนต์ฉันจะทำให้การรักษาก็คือการโยกย้ายรางที่ทีมงานหลักนำผู้ใช้ไป ดังนั้นหากคุณกำลังเรียกใช้db:schema:loadไฟล์ที่สร้างขึ้นโดยอัตโนมัติซึ่งคุณไม่มีการโยกย้ายเพื่อสร้างอีกครั้งโดยอัตโนมัติคุณจะไปยังเส้นทางของ "แก้ไข" สกีมาด้วยตนเองอย่างมีประสิทธิภาพและเลิกใช้การย้ายข้อมูล ฉันหวังว่าฉันจะได้รับการอ้างอิงจากคู่มือรางเกี่ยวกับเรื่องนี้ แต่พวกเขาไม่ได้พูดถึง schema: โหลดซึ่งเพิ่มความยุ่งยากของฉันในการตัดสินใจว่าจะเข้าใกล้คุณสมบัติ schema: โหลด = /
Ninjaxor

ฉันมาที่หน้านี้อย่างแม่นยำเพราะฉันเห็นด้วย ประสบการณ์ของฉันคือเมื่อไซต์อยู่ในระหว่างการผลิตจะปลอดภัยกว่ามากเมื่อใช้การย้ายข้อมูลเพื่อเปลี่ยน ทั้งๆที่มีความคิดเห็นของจุดเริ่มต้นของ db / schema.rb อย่างแม่นยำในทางตรงกันข้าม! (ฉันมีปัญหาในช่วงเริ่มต้นของทุกโครงการเพราะฉันลืมใส่ db / schema.rb ใน. gitignore ... )
user1251840

@AbePetrillo ว้าวฉันพลาดความคิดเห็นนี้ไปแล้ว ไม่แน่นอนสิ่งที่ฉันหมายถึงคือคุณสามารถล้างการย้ายข้อมูลเก่าที่เคยใช้กับเครื่องผลิตทั้งหมดได้หากคุณต้องการ ในช่วงหลายปีที่ผ่านมาฉันมักจะเก็บไว้รอบ ๆ แต่คำสั่ง "ช่วยให้คุณทำความสะอาดการโยกย้ายของคุณเมื่อใดก็ตามที่คุณต้องการ" คำสั่งไม่ได้หมายความว่า ดังนั้นเมื่อคุณปรับใช้เครื่องใหม่ให้เรียกใช้เมื่อเทียบกับrake db:schema:load แล้วจากนั้นเมื่อคุณสามารถrake db:migrate rake db:migrate
ereslibre

9

การย้ายข้อมูลช่วยให้คุณเพิ่มข้อมูลลงในฐานข้อมูลได้เช่นกัน แต่ db: schema: load โหลด schema เท่านั้น


6

เพราะการโยกย้ายสามารถย้อนกลับและให้การทำงานเพิ่มเติม ตัวอย่างเช่นหากคุณต้องการแก้ไขข้อมูลบางส่วนซึ่งเป็นส่วนหนึ่งของการเปลี่ยนแปลงสคีมาคุณจะต้องดำเนินการดังกล่าวเป็นการย้ายข้อมูล


4

ในฐานะผู้ใช้ ORM อื่น ๆ มันดูแปลกสำหรับฉันที่ Rails ไม่มีคุณสมบัติ 'ซิงค์และอัปเดต' เช่นโดยใช้ไฟล์ schema (ซึ่งแสดงถึง schema ที่เป็นปัจจุบันทั้งหมด) ให้ไปที่โครงสร้างฐานข้อมูลที่มีอยู่และเพิ่ม / ลบตารางคอลัมน์ดัชนีตามต้องการ

สำหรับฉันนี่จะแข็งแกร่งมากขึ้นแม้ว่าอาจช้าลงเล็กน้อย


1
งานที่จะย้ายฐานข้อมูลด้วยข้อมูลจากสคีมาที่ซับซ้อนหนึ่งไปอีกอันหนึ่งนั้นไม่สำคัญสักครั้ง อาจไม่ได้รับการแก้ไขโดยอัตโนมัติและข้อมูลอาจไม่ได้รับการโยกย้ายอย่างสม่ำเสมอด้วยขั้นตอนเดียว การโยกย้ายรางเป็นหลักและขึ้นอยู่กับสคีมา สคีมาจะสร้างขึ้นใหม่โดยอัตโนมัติกับการย้ายข้อมูลแต่ละครั้ง แต่ไม่กลับกัน
oklas

คู่มือของ Rails ระบุอย่างชัดเจนว่าschemaเป็นหลักไม่ใช่การย้ายข้อมูล
Drenmi

0

ฉันโพสต์แล้วเป็นความคิดเห็น แต่รู้สึกว่าดีกว่าที่จะใส่ความคิดเห็นของไฟล์ db / schema.rb ที่นี่:

# 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.

ที่จริงแล้วประสบการณ์ของฉันคือการใส่ไฟล์การย้ายข้อมูลไว้ใน git ไม่ใช่ไฟล์ schema.rb ...


0

rake db:migrateตั้งค่าตารางในฐานข้อมูล เมื่อคุณรันคำสั่งการโอนย้ายระบบจะค้นหาใน db / migrate / เพื่อหาไฟล์ ruby ​​และเรียกใช้งานโดยเริ่มต้นด้วยไฟล์เก่าที่สุด มีการประทับเวลาที่จุดเริ่มต้นของชื่อไฟล์การย้ายข้อมูลแต่ละรายการ

ซึ่งแตกต่างจากrake db:migrateที่เรียกใช้การย้ายข้อมูลที่ยังไม่ได้rake db:schema:loadโหลด schema ที่สร้างขึ้นแล้วdb/schema.rbฐานข้อมูล

คุณสามารถหาข้อมูลเพิ่มเติมเกี่ยวกับฐานข้อมูลเสาะหาคำสั่งที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.