การโยกย้ายไปข้างหลังด้วย Django South


217

ตกลงดังนั้นดูเหมือนว่าจะเป็นเรื่องโง่ ๆ จริง ๆ ที่จะถามและฉันแน่ใจว่าฉันขาดอะไรบางอย่าง

คุณจะทำการโยกย้ายย้อนหลังโดยใช้ South บน Django ได้อย่างไร

ดังนั้นฉันจึงปรับแต่งโมเดลของฉันสร้างการโยกย้ายด้วยschemamigrationดำเนินการโยกย้ายด้วยmigrateและตอนนี้ฉันรู้ว่านั่นไม่ใช่สิ่งที่ฉันต้องการและฉันต้องการให้มันกลับมาเหมือนเดิม

การแก้ไขตาราง db ด้วยตนเองและการลบไฟล์การย้ายข้อมูลฉันควรทำอย่างไรกับการย้อนกลับการโยกย้าย ฉันพบการอ้างอิงถึงการโยกย้ายย้อนหลังโดยใช้ South ผ่าน Google แต่ยังไม่พบตัวอย่างรหัสที่ชัดเจนสำหรับมัน

ใครช่วยได้บ้าง


คำถามที่ดี!!
Marshall X

คำตอบ:


335

คุณต้องทราบจำนวนการย้ายข้อมูลก่อนที่จะย้อนกลับ

แอปของคุณควรมีไดเรกทอรีการย้ายข้อมูลโดยมีไฟล์อยู่ในชื่อเหมือน

0000_initial.py
0001_added_some_fields.py
0002_added_some_more_fields.py
0003_deleted_some_stuff.py

โดยปกติเมื่อคุณเรียกใช้./manage.py migrate your_appSouth จะเรียกใช้การย้ายข้อมูลใหม่ทั้งหมดตามลำดับ (ดูที่ตารางฐานข้อมูลเพื่อตัดสินใจว่ารายการใดเป็น 'ใหม่')

อย่างไรก็ตามคุณยังสามารถระบุการโยกย้ายตามหมายเลขและภาคใต้จะย้ายฐานข้อมูลของคุณไปข้างหน้าหรือข้างหลังเพื่อนำไปไว้ที่จุดนั้น ดังนั้นด้วยไฟล์ตัวอย่างด้านบนหากคุณโอนย้ายได้สูงถึง 0003 แล้วและคุณต้องการรัน 0003 ในสิ่งที่ตรงกันข้าม (การเลิกทำอย่างมีประสิทธิภาพ) คุณจะต้องรัน

./manage.py migrate your_app 0002

ทางทิศใต้จะดูที่ฐานข้อมูลตระหนักว่ามันมีการเรียกใช้แล้ว 0003 และตรวจสอบว่ามีการเรียกใช้การโยกย้ายย้อนกลับสำหรับ 0003 เพื่อกลับไปที่ 0002


1
น่าเสียดายที่เมื่อคุณสร้างการย้ายข้อมูลครั้งต่อไปมันจะไม่ข้ามสิ่งที่อยู่ระหว่างไปดังนั้นคุณเพียงแค่ย้ายข้อมูลเหล่านั้นในภายหลัง ดูเหมือนว่าอาจมีวิธีที่ดีกว่า
mlissner

44
@mlissner หากคุณต้องการจริงๆหลังจากย้อนกลับไปที่ฐานข้อมูลให้ไปที่โฟลเดอร์การย้ายข้อมูลของแอพที่ระบุ (ในตัวอย่าง your_app / การย้ายข้อมูล) และลบการย้ายข้อมูลที่ไม่พึงประสงค์ออกไป
Josh Russo

1
แน่นอน - ใต้ไม่เคยข้ามการย้ายถิ่น มันคาดว่าไฟล์จาก 0001-nnnn แสดงถึงชุดของการโยกย้ายที่สอดคล้องกันสำหรับค่าใด ๆ ของ nnnn หากไม่ใช่กรณีดังกล่าวคุณต้องสั่งซื้อใหม่หรือลบรายการที่กระทำผิดด้วยตนเอง
Ian Clelland

217

ในกรณีที่มีคน (เช่นฉัน) สงสัยว่าจะย้ายกลับจากครั้งแรก (0001) :

django-admin.py migrate some_app zero

เอาท์พุท:

Running migrations for some_app:
 - Migrating backwards to zero state.
 < some_app:0001_initial

"ศูนย์" เป็นสถานะพิเศษก่อนการโยกย้ายใด ๆ

การอ้างอิง: http://south.aeracode.org/docs/commands.html


6
มีคนวิ่งโยกย้าย 0001 - ปลอมและนี่เป็นวิธีเดียวที่จะวิ่งย้อนหลัง 0001 ขอบคุณ!
jmanning2k

1
คำตอบที่สำคัญมากฉันสงสัยว่าทำไมmigrate 0000ไม่ทำงาน เกี่ยวกับการย้ายถิ่นของปลอมคุณอาจจำเป็นถ้าคุณต้องการเลิกทำการโยกย้ายครั้งแรก (อาจผิด) แต่ประวัติการย้ายถิ่นคิดว่าการโยกย้ายครั้งนี้ไม่เคยเกิดขึ้น
Tomasz Gandor

3

เพิ่มชื่อการย้ายข้อมูลที่ท้ายพารามิเตอร์:

./manage.py migrate app-name 00xx-migration-name

2
ไม่เป็นไรและฉันเคยทำมาก่อน แต่มันมีการพิมพ์ / วางจำนวนมาก หมายเลข "รัฐ" เปลือย - ในกรณีนี้00xx- ก็เพียงพอแล้ว เมื่อปรับปรุงและทดสอบการโยกย้ายคุณสามารถมีทั้งคำสั่งในประวัติ: ไปข้างหน้า (ไม่มีอาร์กิวเมนต์) ย้อนกลับด้วยหมายเลขสถานะก่อนหน้า
Tomasz Gandor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.