django syncdb และโมเดลที่อัปเดต


86

ฉันเพิ่งอัปเดตโมเดลของฉันเพิ่ม BooleanField เข้าไปอย่างไรก็ตามเมื่อฉันทำpython manage.py syncdbมันจะไม่เพิ่มฟิลด์ใหม่ลงในฐานข้อมูลสำหรับโมเดล ฉันจะแก้ไขปัญหานี้ได้อย่างไร?


17
ความจริงที่ว่า Django ไม่สนับสนุนสิ่งพื้นฐานเช่นนี้ทำให้ฉันไม่สามารถใช้มันเพื่อสร้างแบบจำลองได้เลย ความจริงที่ว่าพวกเขาพิจารณา ORM ที่จัดการกับการสร้างตาราง แต่ไม่ใช่การปรับเปลี่ยนตาราง (ในสถานที่) ให้เป็นคุณภาพการเผยแพร่เกือบจะทำให้ฉันไม่ใช้ Django ทั้งหมด
Glenn Maynard

3
ความจริงที่ว่า Django ช่วยให้สามารถเสียบแอพได้อย่างยอดเยี่ยมทำให้ Django ยอดเยี่ยมและแสดงว่าไม่มีการสนับสนุนในตัวสำหรับการปรับเปลี่ยนตารางโดยทั่วไปไม่เกี่ยวข้อง การติดตั้งแอปยากแค่ไหน?
Dominic Rodger

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

คำตอบ:


100

ตั้งแต่ Django 1.7 เป็นต้นไป

Django ได้สร้างขึ้นในการสนับสนุนสำหรับการโยกย้าย - ดูที่เอกสาร

สำหรับ Django 1.6 และรุ่นก่อนหน้า

Django ไม่รองรับการย้ายข้อมูลนอกกรอบ มีแอพที่เสียบได้สำหรับ Django ที่ทำได้อย่างนั้นและมันก็ใช้งานได้ดี มันเรียกว่าใต้


1
หมายเหตุ: ฉันมีปัญหาในการใช้ South สำหรับการย้ายโมเดลด้วยแบ็กเอนด์ฐานข้อมูลที่กำหนดเอง (เช่น django-mssql)
Don

1
ภาคใต้สวยมาก! ขอบคุณสำหรับเคล็ดลับ
Julien Greard

14

ปัจจุบัน Django ไม่ได้ทำสิ่งนี้โดยอัตโนมัติ ตัวเลือกของคุณคือ:

  1. วางตารางจากฐานข้อมูลแล้วสร้างใหม่ในรูปแบบใหม่โดยใช้ syncdb
  2. พิมพ์ SQL สำหรับฐานข้อมูลโดยใช้python manage.py sql (appname)ค้นหาบรรทัดที่เพิ่มสำหรับฟิลด์และเพิ่มด้วยตนเองโดยใช้alter tableคำสั่ง SQL (ซึ่งจะช่วยให้คุณสามารถเลือกค่าของฟิลด์สำหรับบันทึกปัจจุบันของคุณได้ด้วย)
  3. ใช้ทิศใต้ (ตามคำตอบของโดมินิก )

11

ทำตามขั้นตอนเหล่านี้:

  1. ส่งออกข้อมูลของคุณไปยังฟิกซ์เจอร์โดยใช้คำสั่งการจัดการdumpdata
  2. วางโต๊ะ
  3. เรียกใช้ syncdb
  4. โหลดข้อมูลของคุณซ้ำจากฟิกซ์เจอร์โดยใช้คำสั่งloaddata management

วางและโหลดซ้ำสำหรับสิ่งที่ควรทำในสถานที่? แย่มาก
Glenn Maynard

3
มันเป็นคำสั่งการจัดการที่เรียบง่ายไม่ใช่ชุดการโยกย้าย! Django ไม่มีทางคาดเดาได้ว่าข้อมูลของคุณเปลี่ยนแปลงไปอย่างไรหรือจะเก็บรักษาอย่างไรดังนั้นจึงยืนยันว่าคุณทำเอง หากคุณไม่ชอบให้ใช้เครื่องมือการย้ายข้อมูลเช่นทิศใต้
Soviut

8

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

ฉันคิดว่ามันง่ายกว่าที่จะเริ่มต้นกับภาคใต้และมันก็ทำงานได้ดีในครั้งแรกที่ฉันพิมพ์./manage.py evolve --hint --executeดังนั้นฉันก็พอใจกับมัน


7
หลังจากใช้ Django Evolution และ South มาเกือบหนึ่งปีฉันก็เปลี่ยนความคิดเห็น ภาคใต้น่ากลัว แต่มันเป็นอย่างมากเช่น Git ในความรู้สึกที่คุณต้องให้แน่ใจว่าคุณจริงๆเข้าใจวิธีการทำงาน หากคุณพิมพ์คำสั่งสุ่มสี่สุ่มห้าคุณมักจะทำผิดพลาดในครั้งแรกที่คุณหรือคนในทีมทำผิดพลาด
Dan Abramov

2

ไม่ได้ใช้ django มาระยะหนึ่งแล้ว แต่ฉันดูเหมือนจะจำได้ว่า syncdb ทำการเปลี่ยนแปลงคำสั่งบนตาราง db คุณต้องวางตารางแล้วเรียกใช้อีกครั้งและจะสร้างอีกครั้ง

แก้ไข: ขออภัยไม่ได้ทำการแก้ไข


จากนั้นมันไม่ได้รันalter tableคำสั่งมันกำลังรันcreate tableคำสั่ง
Dominic Rodger

ฉันมีข้อมูลในฐานข้อมูลดังนั้นมันจะดีมากถ้าฉันเอาชนะปัญหานี้โดยไม่ทิ้ง
Hellnar

1
ฉันคิดว่าคุณอยากจะบอกว่า syncdb ไม่ดำเนินการแก้ไขคำสั่ง คุณไม่ต้องวางตารางคุณสามารถเพิ่มฟิลด์ใหม่ลงใน sql ของคุณด้วยตนเองได้เช่นกัน
Odif Yltsaeb

ใช่ แต่คำถามอ้างถึงการใช้ syncdb ดังนั้นในกรณีนี้คุณจะต้องวางตารางเพื่อใช้ syncdb หรือใช้ปลั๊กอินที่กล่าวถึงด้านล่าง
Alex H

1
หากคุณรู้สึกผิดหวังกับภาคใต้ลองใช้ Django Evolution แทน ทำงานได้ดีสำหรับฉัน stackoverflow.com/questions/1605662/…
Dan Abramov


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