ФорумПрограммированиеPythonDjango → Нахуивертил с миграциями, помогайте

Нахуивертил с миграциями, помогайте

  • Crank

    Сообщения: 542 Репутация: N Группа: Джедаи

    Spritz 15 января 2016 г. 1:17

    Накосячил что-то с зависимостями и натворил пиздеца, насозадавал и наудалял моделей, а потом еще и потер часть миграций и получися полный ахтунг.

    Удалил таблицу модели CatalogImage. В другой модели осталось поле (image_id) с ключем для связи с удаленной моделью. Теперь я нихуя не могу удалить поле image_id, при попытке сделать migrate оно ругается.

    
    python manage.py migrate
    Operations to perform:
      Apply all migrations: admin, catalog, contenttypes, auth, sessions
    Running migrations:
      Rendering model states... DONE
      Applying catalog.0009_catalogelement_image...Traceback (most recent call last):
      File "manage.py", line 10, in <module>
        execute_from_command_line(sys.argv)
      File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 350, in execute_from_command_line
        utility.execute()
      File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 342, in execute
        self.fetch_command(subcommand).run_from_argv(self.argv)
      File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 348, in run_from_argv
        self.execute(*args, **cmd_options)
      File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 399, in execute
        output = self.handle(*args, **options)
      File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/migrate.py", line 200, in handle
        executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial)
      File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/executor.py", line 92, in migrate
        self._migrate_all_forwards(plan, full_plan, fake=fake, fake_initial=fake_initial)
      File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/executor.py", line 121, in _migrate_all_forwards
        state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
      File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/executor.py", line 198, in apply_migration
        state = migration.apply(state, schema_editor)
      File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/migration.py", line 123, in apply
        operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
      File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/operations/fields.py", line 62, in database_forwards
        field,
      File "/usr/local/lib/python2.7/dist-packages/django/db/backends/mysql/schema.py", line 50, in add_field
        super(DatabaseSchemaEditor, self).add_field(model, field)
      File "/usr/local/lib/python2.7/dist-packages/django/db/backends/base/schema.py", line 396, in add_field
        self.execute(sql, params)
      File "/usr/local/lib/python2.7/dist-packages/django/db/backends/base/schema.py", line 110, in execute
        cursor.execute(sql, params)
      File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 79, in execute
        return super(CursorDebugWrapper, self).execute(sql, params)
      File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute
        return self.cursor.execute(sql, params)
      File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line 95, in __exit__
        six.reraise(dj_exc_type, dj_exc_value, traceback)
      File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute
        return self.cursor.execute(sql, params)
      File "/usr/local/lib/python2.7/dist-packages/django/db/backends/mysql/base.py", line 112, in execute
        return self.cursor.execute(query, args)
      File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 174, in execute
        self.errorhandler(self, exc, value)
      File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
        raise errorclass, errorvalue
    django.db.utils.OperationalError: (1060, "Duplicate column name 'image_id'")
    

    Пора уже спать но я нихера не могу уснуть, застрял как школяр. Через phpmyadmin тоже нихуя не могу удалить image_id.

    Спустя 278 сек.

    Пытаюсь удалить через shell но тоже нихуя не выходит

    
    In [1]: from django.db import migrations
    In [2]: migrations.RemoveField('catalogelement', 'image')
    Out[2]: <RemoveField 'catalogelement', 'image'>
    
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 15 января 2016 г. 1:38, спустя 21 минуту 27 секунд

    пиздец чо

    Сапожник без сапог
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz 15 января 2016 г. 2:17, спустя 39 минут 5 секунд

    поддерживаю предыдущего оратора

    не всё полезно, что в swap полезло
  • Sinkler

    Сообщения: 7958 Репутация: N Группа: в ухо

    Spritz 15 января 2016 г. 2:30, спустя 12 минут 29 секунд

    @Crank, если удалял какие-то мигарции, то надо ещё удалять записи в таблице django_migrations + смотреть, чтобы у текущих миграций не было никаких ссылок на удалённые

  • Crank

    Сообщения: 542 Репутация: N Группа: Джедаи

    Spritz 15 января 2016 г. 8:58, спустя 6 часов 28 минут 41 секунду

    @Sinkler, спс, буду разбираться со свежей головой.

  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz 15 января 2016 г. 9:18, спустя 19 минут 59 секунд

    Через phpmyadmin тоже нихуя не могу удалить image_id.

    @Crank, вот это вообще странно. Что мешает, какая ошибка?

  • Crank

    Сообщения: 542 Репутация: N Группа: Джедаи

    Spritz 15 января 2016 г. 9:22, спустя 3 минуты 15 секунд

    @AlexB, вот и я первый раз с таким столкнулся и чет растерялся.
    Получается вот такой фашизм

    mysql> ALTER TABLE catalog_catalogelement DROP image_id;
    ERROR 1025 (HY000): Error on rename of './mybase/#sql-a71_25557' to './mybase/catalog_catalogelement' (errno: 150)

    Сейчас читаю про 150 ошибку.

  • Crank

    Сообщения: 542 Репутация: N Группа: Джедаи

    Spritz 15 января 2016 г. 11:48, спустя 2 часа 26 минут 49 секунд

    Интересно насколько в данной ситуации будет корректным такое решение?
    1. сделать дамп данных без структуры
    2. ебнуть нахуй базу и все миграции
    3. сделать заново makemigrations, migrate
    4. залить дамп

  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz 15 января 2016 г. 12:10, спустя 21 минуту 41 секунду

    А нет какой-нибудь другой таблицы с FK на это поле?

  • mathete

    Сообщения: 435 Репутация: N Группа: Джедаи

    Spritz 15 января 2016 г. 12:24, спустя 13 минут 23 секунды

    Ну я вижу, что проблема в mysql. Да и вроде самая обычная, для игрушечных СУБД (без транзакций на структуре). Делается это как-то так - запускаем drop колонки, потом посередине стопаем запрос. Имеем часть записей с колонкой, часть без.

    Это такой фундаментальный фейл mysql, что его нельзя закрыть никакими другими "фишками". Годами избегаю mysql. В проектах "с нуля" никогда и не использовал. Автору советую переехать на postgresql и забыть, что такие проблемы возможны.

  • Crank

    Сообщения: 542 Репутация: N Группа: Джедаи

    Spritz 15 января 2016 г. 12:24, спустя 11 секунд

    @AlexB, вроде бы нет, да и откуда ей взяться.

    Спустя 122 сек.

    @mathete, видимо придется смотреть в в эту сторону, по тому что спотыкаться и убивать столько времени на таких тривиальных вещах очень неприятно.

  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 15 января 2016 г. 12:55, спустя 31 минуту 28 секунд

    @mathete, пруф? Никогда про такое не слышал, выглядит как фантазия

    Сапожник без сапог
  • mathete

    Сообщения: 435 Репутация: N Группа: Джедаи

    Spritz 15 января 2016 г. 15:38, спустя 2 часа 42 минуты 36 секунд

    @phpdude, эээ... как это не слышал? Это самый главный камень при DB-срачах. Я хоть сам почти и не работал с mysql, но нарывался на этот эпик.

    Мы с @adw0rd, даже специальный доклад слушали на эту тему - MySQL: проблемы, решения и последствия / Мастерская интернет-разработчика [adw0rd.com] . Ну не прям на эту, но там это тоже обсуждалось ( [adw0rd.com]).

    Может, конечно, с 2012 года всё поменялось, но я за развитием клубов из любительских дивизионов не слежу))

  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 15 января 2016 г. 16:44, спустя 1 час 6 минут 2 секунды

    @mathete, ок)

    Сапожник без сапог

Пожалуйста, авторизуйтесь, чтобы написать комментарий!