Django South - стіл вже існує


188

Я намагаюся розпочати роботу з Півднем. У мене була наявна база даних, і я додав Південь ( syncdb, schemamigration --initial).

Потім я оновив, models.pyщоб додати поле і побіг ./manage.py schemamigration myapp --auto. Здавалося, знайшов поле і сказав, що я можу це застосувати ./manage.py migrate myapp. Але це робило помилку:

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

tablename- перша таблиця, перелічена в models.py.

Я бігаю Django 1.2, південь 0.7

Відповіді:


311

оскільки у вас вже є таблиці, створені в базі даних, вам просто потрібно виконати початкову міграцію як підроблену

./manage.py migrate myapp --fake

переконайтесь, що схема моделей така сама, як схема таблиць у базі даних.


1
Зрозумів дякую. Це насправді міграція, а не схеміміграція, але ваша відповідь підвела мене в правильному напрямку.
Стів

1
моя помилка просто скопіювала команду з ОП, правильна команда ./manage.py міграція myapp --fake
Ashok

Це рішення не вирішило проблему в моєму випадку. Я не змінив базу даних і перебив деякі погляди, оскільки поле не було створене на столі. Мені довелося коментувати нове майно, знову мігрувати з підробкою, щоб відновити все, а другий раз, коли я його спробував, це спрацювало, що я досі не розумію ... :)
Мак-

1
@Ashok, можливо, ви також повинні вказати, що ми повинні повторити schemamigrationперед тим, як migrateми вже вносили модифікації до останнього schemamigration.
П’єр де ЛЕСПІНАЙ

3
Це мені не допомогло. У мене вже була таблиця в моїй базі даних, і після підробленої міграції не було можливості додати інші таблиці, які були підробленими. Довелося скинути всі столи і почати свіжими.
Шейлен

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 перемістити myapp

Якщо це не виходить, ви готові. Просто двічі позначте, якщо будь-яке поле не пропущено.

Редагувати:

Ця проблема також може виникнути, коли у вас є виробнича база даних, для якої ви встановлюєте Південь, і перша, початкова міграція, створена в інших програмах, дублює те, що ви вже маєте в db. Тут рішення набагато простіше:

  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

Це повинно бути вище! Якщо ви використовуєте транзакції з схемою db без транзакції, це може статися досить легко
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файлі, тож у вашій базі даних можуть бути таблиці сміття з попередніх syncdbs або 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) python Manag.py schemamigration apps.appname - первісний

Наведений вище крок створює папку міграції за замовчуванням.

2) python Manag.py мігрувати apps.appname --файл

генерує підроблену міграцію.

3) python Manag.py schemamigration apps.appname --auto

Потім ви можете додати поля за своїм бажанням і виконати вищевказану команду.

4) python Manag.py мігрувати apps.appname


1

Якщо у вас є база даних та додаток, ви можете скористатися командою перетворення на південь

./manage.py convert_to_south myapp

Це потрібно застосувати перед тим , як внести будь-які зміни до того, що вже є в базі даних.

Команда convert_to_south повністю працює лише на першій машині, на якій ви її запустите. Після того, як ви здійснили початкові міграції, які він здійснив у свій VCS, вам доведеться запуститись ./manage.py migrate myapp 0001 --fakeна кожній машині, яка має копію бази коду (переконайтеся, що вони були в курсі моделей і схем спочатку). посилання: 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. Ви можете вибрати запити, які потрібно запустити, уникаючи частини, яка створює існуючу таблицю

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.