Чому міграція на південь не працює?


78

Спочатку я створюю свою базу даних.

create database mydb;

Я додаю "південь" до встановлених додатків. Потім я переходжу до цього підручника: http://south.aeracode.org/docs/tutorial/part1.html

Підручник пропонує мені зробити це:

$ py manage.py  schemamigration wall --initial
>>> Created 0001_initial.py. You can now apply this migration with: ./manage.py migrate wall

Чудово, зараз я мігрую.

$ py manage.py migrate wall

Але це видає мені цю помилку ...

django.db.utils.DatabaseError: (1146, "Table 'fable.south_migrationhistory' doesn't exist")

Тому я використовую Google (який ніколи не працює. Звідси мої 870 запитань, задані Stackoverflow), і я отримую цю сторінку: http://groups.google.com/group/south-users/browse_thread/thread/d4c83f821dd2ca1c

Гаразд, тому я дотримуюся цих вказівок

>> Drop database mydb;
>> Create database mydb;
$ rm -rf ./wall/migrations
$ py manage.py syncdb

Але коли я запускаю syncdb, Django створює купу таблиць. Так, він створює таблицю south_migrationhistory, але також створює таблиці мого додатка.

Synced:
 > django.contrib.admin
 > django.contrib.auth
 > django.contrib.contenttypes
 > django.contrib.sessions
 > django.contrib.sites
 > django.contrib.messages
 > south
 > fable.notification
 > pagination
 > timezones
 > fable.wall
 > mediasync
 > staticfiles
 > debug_toolbar

Not synced (use migrations):
 - 
(use ./manage.py migrate to migrate these)

Класно .... тепер це говорить мені перенести їх. Отже, я роблю це:

$ py manage.py  migrate wall
The app 'wall' does not appear to use migrations.

Гаразд, так добре. Я додаю стіну до початкових міграцій.

$ py manage.py schemamigration wall --initial

Потім я мігрую:

$ py manage.py migrate wall

Знаєш, що? Це дає мені цей BS:

_mysql_exceptions.OperationalError: (1050, "Table 'wall_content' already exists")

Вибачте, це мене справді злить. Хтось може допомогти? Дякую.

Як змусити Південь працювати та синхронізуватись із усіма? Єдине, що я можу придумати, це видалити свою програму з INSTALLED_APPS, потім запустити syncdb, а потім знову додати.

Це ТАК ГУРНО.


6
Відповідь Кена, в основному, правильна, що стосується рішень, але лише для того, щоб вказати, що пішло не так, щоб ви могли навчитися з цього: видалення каталогу міграцій було проблемою вдруге. Починаючи з чистої БД: 1. створіть свої міграції для будь-якої програми, яка їх використовує, 2. запустіть syncdb, 3. запустіть команду migrate. Це використовуватиме syncdb для створення немігруючих таблиць, а південь - для перенесених. Останній момент: коли на виході syncdb написано "Не синхронізовано (використовувати міграції):", обов’язково прочитайте, що насправді з’являється після цього. У вашому виданні не було чого мігрувати, оскільки у вас не було міграцій.
Gabriel Hurley

2
+1 за детальний аналіз вашої проблеми
Філіп Дупанович,

Якщо ви маєте справу з класами в декількох файлах, перевірте, чи є в них app_label у всіх!
andilabs

Відповіді:


175

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

Ваша перша помилка була, коли ви видалили свої міграції, як тільки це зробили, а потім запустили syncdb, Django не знав, що ви хочете більше керувати цим додатком на південь, тому він створив таблиці для вас. Коли ви створили свої початкові міграції, а потім запустили міграцію, південь намагався створити таблиці, які вже створив django, і, отже, вашу помилку.

На даний момент у вас є два варіанти.

  1. Видаліть таблиці для настінного додатка з бази даних, а потім запустіть. $ py manage.py migrate wallЦе запустить міграцію та створить ваші таблиці.

  2. Помилка початкового запуску міграції $ py manage.py migrate wall 0001 --fakeЦе скаже південному, що у вас вже є таблиці в базі даних, тому просто підробіть, що додасть рядок до таблиці south_migrationhistory, щоб наступного разу, коли ви виконаєте міграцію, він знав, що перша міграція вже запущено.

Налаштування абсолютно нового проекту і відсутність бази даних

  1. створити базу даних
  2. додати південь до встановлених програм
  3. запустіть syncdb, це додасть таблиці django та south до бази даних
  4. додайте свої програми
  5. для кожного запуску програми python manage.py schemamigration app_name --initial це створить початкові файли міграції для вашої програми
  6. потім запустіть south migrate, python manage.py migrate app_nameце додасть таблиці до бази даних.

Налаштування застарілого проекту та бази даних

  1. додати південь до встановлених програм
  2. запустіть syncdb, це додасть південні таблиці до бази даних
  3. для кожного запущеного вашого додатка python manage.py schemamigration app_name --initialЦе створить ваші початкові міграції
  4. для кожного запущеного вашого додатку python manage.py migrate app_name 0001 --fakeце буде фальшивий південь, він нічого не зробить з базою даних для цих моделей, він просто додасть записи до таблиці south_migrationhistory, щоб наступного разу, коли ви захочете створити міграцію, ви всі встановити.

Налаштування застарілого проекту та відсутність бази даних

  1. створити базу даних
  2. додати південь до встановлених програм
  3. для кожної запущеної програми python manage.py schemamigration app_name --initialЦе створить ваші початкові міграції
  4. запустіть syncdb, це додасть будь-які програми, які не мають міграцій, до бази даних.
  5. потім запустіть південну міграцію, python manage.py migrateце запустить усі міграції для ваших додатків.

Тепер, коли ви налаштували південь, ви можете почати використовувати південь для управління змінами моделей цих програм. Найпоширеніша команда для запуску - python manage.py schemamigration app_name migration_name --autoце перегляд останньої запущеної вами міграції, вона знайде зміни та створить для вас файл міграції. Тоді вам просто потрібно запустити, python manage.py migrateі це змінить вашу базу даних для вас.

Сподіваюся, що це допомагає.


3
Гарна відповідь, Кен. Ви можете подумати про редагування своєї відповіді, щоб включити трохи більше того, що насправді пішло не так у процесі (див. Мій коментар вище), щоб майбутні, хто натрапляє на вашу відповідь, отримували найкращу інформацію.
Gabriel Hurley

@Gabriel Я зробив, як ти запропонував, і додав більше інформації до моєї відповіді. Дякую за допомогу.
Ken Cochrane

1
До речі, це для того, щоб взяти свій проект, що не стосується Півдня, і додати Південь, а не для того, щоб отримати проект, який вже використовує Південь і працює. У цих випадках синхронізація та міграція - це все, що вам потрібно.
Bryan

11

Ось так я працюю.

pip install South

# add 'south', to INSTALL_APPS, then
python manage.py syncdb

# For existing project + database
python manage.py convert_to_south app_name

# Thereafter, call them per model changes
python manage.py schemamigration app_name --auto
python manage.py migrate app_name

Список літератури:

http://garmoncheg.blogspot.com/2011/08/django-how-and-why-to-use-migrations.html http://www.djangopro.com/2011/01/django-database-migration-tool -повторне пояснення /


8

Підручник, який ви використовуєте, говорить:

(Якщо це не дає скарги на те, що south_migrationhistory не існує, ви забули запустити syncdb після встановлення South .)

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

  1. Додайте південь до INSTALLED_APPS.
  2. Біжи syncdb.
  3. Тоді дотримуйтесь підручника.

Тобто, вам слід було вже запускатись, syncdbперш ніж додавати в моделі для вашого нового додатка. Ваше рішення щодо видалення програми INSTALLED_APPSмає працювати, але варто зазначити, що насправді це лише "безглузде" обхідне рішення, оскільки ви пропустили крок раніше. Було syncdbзапущено до того, як ви створили моделі для цього додатка, вам не довелося б використовувати обхід.


3

Лише для майбутнього посилання Якщо Південь створює будь-які проблеми:

  1. Видаліть каталоги міграцій із каталогів програм
  2. Видаліть South _migrations зі своєї бази даних
  3. Запустіть manage.py syncdb
  4. Поверніться до використання Півдня (наприклад, './manage.py convert_to_south something, ./manage.py migrate ...')

1

Це здається очевидним, але я настійно рекомендую прочитати документи.

Навіть прочитавши відповіді на це питання, я намагався зрозуміти, як ефективно використовувати Південь.

Все це, звичайно, змінилося того дня, коли я прочитав документи, і вам теж слід було б це зробити, Південь простіший у використанні, ніж ви можете подумати.

http://south.aeracode.org/docs/about.html

http://south.aeracode.org/docs/tutorial/index.html

http://south.aeracode.org/docs/convertinganapp.html#converting-an-app

Я також знайшов це корисним:

http://www.djangopro.com/2011/01/django-database-migration-tool-south-explained/

І обов’язково прочитайте статті Джеффа Етвуда про кодування жахів про контроль версій бази даних.


+1 Я щойно прийшов до того, що мені так набридло мавпою виправляти всі дивні південні помилки. На жаль ТАК не дуже допомагає щодо півдня. Можливо, мені слід справді сісти і прочитати документ, як ти кажеш.
Philip007

0

Як змусити Південь працювати та синхронізуватись із усіма? Єдине, що я можу придумати, це видалити свою програму з INSTALLED_APPS, потім запустити syncdb, а потім знову додати.

Я використовував це виправлення з проблемами Півдня раніше. Не гарне рішення, але дуже ефективне;)

Але головна проблема полягає в тому, що ваше замовлення неправильне. Вам слід було запустити syncdb перед підручником. Чим це працює належним чином.

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