Django South - มีตารางอยู่แล้ว


188

ฉันพยายามเริ่มต้นกับภาคใต้ ฉันมีฐานข้อมูลที่มีอยู่และฉันเพิ่ม South ( syncdb, schemamigration --initial)

จากนั้นฉันปรับปรุงเพื่อเพิ่มข้อมูลและวิ่งmodels.py ./manage.py schemamigration myapp --autoดูเหมือนว่าจะพบสนามและบอกว่าฉันสามารถใช้มัน./manage.py migrate myappได้ แต่การทำเช่นนั้นทำให้เกิดข้อผิดพลาด:

django.db.utils.DatabaseError: table "myapp_tablename" already exists

tablenamemodels.pyเป็นตารางแรกที่ระบุไว้ใน

ฉันใช้ Django 1.2, South 0.7

คำตอบ:


311

เนื่องจากคุณมีตารางที่สร้างขึ้นในฐานข้อมูลอยู่แล้วคุณเพียงแค่ต้องเรียกใช้การย้ายข้อมูลเริ่มต้นเป็นของปลอม

./manage.py migrate myapp --fake

ตรวจสอบให้แน่ใจว่าสคีมาของแบบจำลองเหมือนกับสคีมาของตารางในฐานข้อมูล


1
เข้าใจแล้วขอบคุณ มันคือการโยกย้ายและไม่ใช่แบบแผน แต่คำตอบของคุณทำให้ฉันไปในทิศทางที่ถูกต้อง
Steve

1
ความผิดพลาดของฉันเพิ่งคัดลอกคำสั่งจาก OP คำสั่งที่ถูกต้อง. / manage.py โอนย้าย myapp --fake
Ashok

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

1
@Shok บางทีคุณควรระบุเราต้องทำซ้ำschemamigrationก่อนmigrateในกรณีที่เราทำการแก้ไขก่อนหน้าschemamigrationนี้แล้ว
Pierre de LESPINAY

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

41

แม้ว่าตาราง "myapp_tablename" มีอยู่แล้วเกิดข้อผิดพลาดหยุดการเพิ่มหลังจากที่ฉันทำ. / manage.py โยกย้าย myapp --fake DatabaseError จะไม่แสดงคอลัมน์ดังกล่าว: myapp_mymodel.added_field

เจอปัญหาเดียวกันหมด!

1. ตรวจสอบหมายเลขการโยกย้ายครั้งแรกที่เป็นสาเหตุของปัญหานี้ ให้ถือว่าเป็น: 0010

2. คุณต้อง:

./manage.py schemamigration myapp --add-field MyModel.added_field
./manage.py migrate myapp

หากไม่มีมากกว่าหนึ่งช่องคุณต้องทำซ้ำสำหรับแต่ละฟิลด์

3. ตอนนี้คุณมีการย้ายข้อมูลจำนวนมากดังนั้นให้ลบไฟล์ออกจาก myapp / migrations (0011 และต่อไปหากคุณต้องการเพิ่มหลายฟิลด์)

4. เรียกใช้สิ่งนี้:

./manage.py migrate myapp 0010

ตอนนี้ลอง. /manage.py โอนย้ายแอปของฉัน

ถ้ามันไม่ล้มเหลวคุณก็พร้อม เพียงแค่ตรวจสอบอีกครั้งถ้าฟิลด์ใดฟิลด์หนึ่งไม่หายไป

แก้ไข:

ปัญหานี้ยังสามารถเกิดขึ้นได้เมื่อคุณมีฐานข้อมูลการผลิตที่คุณติดตั้งใต้และการโยกย้ายครั้งแรกการสร้างครั้งแรกในสภาพแวดล้อมอื่น ๆ ที่ซ้ำกันสิ่งที่คุณมีอยู่ในฐานข้อมูลของคุณ การแก้ปัญหาง่ายกว่ามากที่นี่:

  1. ปลอมการโยกย้ายครั้งแรก:

    ./ จัดการโยกย้าย myapp 0001 - ปลอม

  2. กลิ้งไปกับการโยกย้ายที่เหลือ:

    ./ จัดการโยกย้าย myapp


10

เมื่อฉันพบข้อผิดพลาดนี้มันมีสาเหตุอื่น

ในกรณีของภาคใต้ได้ทิ้งอย่างใดในฐานข้อมูลของฉันว่างเปล่าตารางชั่วคราวซึ่งจะใช้ใน_remake_table () บางทีฉันอาจยกเลิกการโยกย้ายในแบบที่ฉันไม่ควรมี ในกรณีใด ๆ ตามมาในแต่ละการโยกย้ายใหม่เมื่อมันเรียกว่า _remake_table () ถูกขว้างปาข้อผิดพลาดsqlite3.pypysqlite2.dbapi2.OperationalError: table "_south_new_myapp_mymodel" already existsเพราะมันไม่อยู่แล้วและไม่ควรที่จะมี

บิต _south_new ดูแปลกสำหรับฉันดังนั้นฉันเรียกดูฐานข้อมูลของฉันเห็นโต๊ะ_south_new_myapp_mymodelขูดหัวของฉันดูที่แหล่งใต้ตัดสินใจว่ามันเป็นขยะทิ้งโต๊ะและทุกอย่างก็ดี


นี่คือสิ่งที่ฉันเห็นและหากฉันพบสิ่งนี้จะช่วยให้ฉันปวดใจได้ครึ่งชั่วโมง ค่อนข้างไม่เป็นที่พอใจ - แต่นี่เป็นตารางการย้ายถิ่นชั่วคราวและถูกทิ้งไว้ระหว่างการย้ายถิ่นที่ล้มเหลวซึ่งอาจเป็นไปเพื่อการตรวจสอบ เหมืองเกิดขึ้นเนื่องจากปัญหาความสมบูรณ์ของ db ในระหว่างการย้ายข้อมูล
Danny Staple

สิ่งนี้จะต้องสูงขึ้น! หากคุณกำลังใช้ธุรกรรม schema db w / o สิ่งนี้สามารถเกิดขึ้นได้อย่างง่ายดาย
Yuji 'Tomita' Tomita

2

หากคุณมีปัญหากับแบบจำลองของคุณที่ไม่ตรงกับฐานข้อมูลของคุณเช่น @pielgrzym และคุณต้องการโอนย้ายฐานข้อมูลโดยอัตโนมัติเพื่อให้ตรงกับไฟล์ models.py ล่าสุด (และลบข้อมูลใด ๆ ที่จะไม่ถูกสร้างใหม่โดยการติดตั้งในระหว่างmigrate):

manage.py schemamigration myapp --initial
manage.py migrate myapp --fake
manage.py migrate myapp zero
manage.py migrate myapp

นี้จะลบและสร้างตารางฐานข้อมูลที่มีอยู่ในล่าสุดของคุณmodels.pyไฟล์เพื่อให้คุณอาจมีตารางขยะในฐานข้อมูลของคุณจากก่อนหน้านี้syncdbหรือmigrates หากต้องการกำจัดสิ่งเหล่านี้ให้นำหน้าการย้ายข้อมูลทั้งหมดเหล่านี้ด้วย:

manage.py sqlclear myapp | manage.py sqlshell

และถ้ายังมี CRUFT เหลืออยู่ในฐานข้อมูลของคุณคุณจะต้องทำinspectdbและสร้างmodels.pyไฟล์จากนั้น (สำหรับตารางและแอพที่คุณต้องการลบ) ก่อนที่จะทำsqlclearแล้วกู้คืน models.py เดิมของคุณก่อน สร้างการ--initialโยกย้ายและการโยกย้ายไป ทั้งหมดนี้เพื่อหลีกเลี่ยงการสับสนกับรสชาติเฉพาะของ SQL ที่ฐานข้อมูลของคุณต้องการ


1

Perform these steps in order may help you:

1) หลาม Manage.py schemamigration apps.appname --initial

ขั้นตอนด้านบนสร้างโฟลเดอร์การย้ายข้อมูลเป็นค่าเริ่มต้น

2) python Manage.py โอนย้ายแอพพลิเคชั่นชื่อ - ปลอม

สร้างการย้ายถิ่นปลอม

3) หลาม Manage.py schemamigration apps.appname --auto

จากนั้นคุณสามารถเพิ่มเขตข้อมูลตามที่คุณต้องการและดำเนินการคำสั่งดังกล่าว

4) python Manage.py โอนย้ายแอปพลิเคชันชื่อ


1

หากคุณมีฐานข้อมูลและแอพอยู่แล้วคุณสามารถใช้คำสั่งการแปลงใต้

./manage.py convert_to_south myapp

สิ่งนี้จะต้องนำไปใช้ก่อนที่คุณจะทำการเปลี่ยนแปลงใด ๆ ที่มีอยู่ในฐานข้อมูล

คำสั่ง convert_to_south ใช้งานได้กับเครื่องแรกที่คุณรันเท่านั้น เมื่อคุณยืนยันการโอนย้ายเริ่มต้นที่ทำไว้ใน VCS ของคุณคุณจะต้องเรียกใช้./manage.py migrate myapp 0001 --fakeบนเครื่องทุกเครื่องที่มีสำเนาของ codebase (ตรวจสอบให้แน่ใจว่ารุ่นและสคีมาเป็นรุ่นล่าสุดแล้ว) ref: http://south.readthedocs.org/en/latest/convertinganapp.html


0

ในฐานะที่เป็นโซลูชั่นชั่วคราวคุณสามารถแสดงความคิดเห็นในการสร้างตารางในสคริปต์การโยกย้าย

class Migration(migrations.Migration):

    dependencies = [
        (...)
    ]

    operations = [
        #migrations.CreateModel(
        #    name='TABLE',
        #    fields=[
        #            ....
        #            ....
        #    ],
        #),
        ....
        ....

หรือ

หากตารางที่มีอยู่ไม่มีแถว (ว่าง) ให้ลองลบตารางดังนี้ (แก้ไขนี้จะแนะนำเฉพาะในกรณีที่ตารางมีไม่มีแถว) ตรวจสอบให้แน่ใจด้วยว่าการดำเนินการนี้ก่อนการดำเนินการ createModel

class Migration(migrations.Migration):

    dependencies = [
        (...),
    ]

    operations = [
        migrations.RunSQL("DROP TABLE myapp_tablename;")
    ]

0

อีกหนึ่งวิธีแก้ปัญหา (อาจเป็นทางออกชั่วคราว)

$ python manage.py sqlmigrate APP_NAME MIGRATION_NAME

เช่น.,.

$ python manage.py sqlmigrate users 0029_auto_20170310_1117

นี่จะแสดงรายการการย้ายข้อมูลทั้งหมดในการสืบค้น sql raw คุณสามารถเลือกแบบสอบถามที่คุณต้องการเรียกใช้หลีกเลี่ยงส่วนที่สร้างตารางที่มีอยู่

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