Django - Ошибка - django.db.utils.OperationalError: (1005, "Can't create table

    blazer |   30.09.2015 |   11:01:56 |   MySql |

Создал новую модель с классом ForeignKey - многое-к-одному и при миграции в базу данных получаю ошибку.

django.db.utils.OperationalError: 
(1005, "Can't create table

 

Решение проблемы:

После не долгих танцев с бубном была нагуглено эта инструкция.

Storage engines

MySQL has several storage engines. You can change the default storage engine in the server configuration.

Until MySQL 5.5.4, the default engine was MyISAM [1]. The main drawbacks of MyISAM are that it doesn’t support transactions or enforce foreign-key constraints. On the plus side, it was the only engine that supported full-text indexing and searching until MySQL 5.6.4.

Since MySQL 5.5.5, the default storage engine is InnoDB. This engine is fully transactional and supports foreign key references. It’s probably the best choice at this point. However, note that the InnoDB autoincrement counter is lost on a MySQL restart because it does not remember the AUTO_INCREMENT value, instead recreating it as “max(id)+1”. This may result in an inadvertent reuse of AutoField values.

If you upgrade an existing project to MySQL 5.5.5 and subsequently add some tables, ensure that your tables are using the same storage engine (i.e. MyISAM vs. InnoDB). Specifically, if tables that have a ForeignKey between them use different storage engines, you may see an error like the following when running migrate:

_mysql_exceptions.OperationalError: ( 1005, "Can't create table '\\db_name\\.#sql-4a8_ab' (errno: 150)" )

 

Ссылка на страницу

  1. Из которой было ясно, что нужно зайти в свою базу данных в настройки таблицы которую я создал - в моем случае это таблица "formsactive_app" и в разделе операции изменить InnoDB на MyISAM.
  2. Еще как вариант можно в конфигурационном файле MySql my.ini изменить строку default-storage-engine=InnoDB на default-storage-engine=MyISAM и вновь созданные таблицы будут иметь тип MyISAM (по умолчанию)
  3. Что бы изменить тип таблицы в уже созданной таблице - нужно: Сделать бэкап таблице и открыть ее редактором например Notepad++ и найти нужную таблицу в которой требуется изменить тип. В моем случае была проблема с таблицей comments она имела тип InnoDB, после изменения ENGINE=InnoDB на ENGINE=MyISAM - проблема решина.
    CREATE TABLE IF NOT EXISTS `comments` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `comments_text` longtext NOT NULL,
      `comments_blogpost_id` int(11) NOT NULL,
      PRIMARY KEY (`id`),
      KEY `comments_96f64791` (`comments_blogpost_id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;

     

Проблема решена.

Добавление при ошибке 1005-1050:

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

В моем случае, когда мне нужно было сделать модель профиль пользователя я не учел такую вещь. В базе данных есть таблица auth_user она в MyISAM по умолчанию. Я создал модель

profile = models.OneToOneField(User, null=True)

она создалась в InnoDB и из-за этого при миграции у меня была проблема вываливалась ошибка 1050 и д.р. Поскольку моя модель связывается с таблицей auth_user, то она тоже должна быть в MyISAM.

Чтоб забыть об этом геморое раз и навсегда сделайте несколько простых вещей.

1. Удалите из папки migrations вашего приложения все миграции кроме __init__.py а также удалите в базе данных в таблице django_migrations все миграции относящиеся к вашему приложению и удалите саму таблицу для которой не проходят миграции.

2. В настройках базы данных в файле settings.py сделайте как у меня и выполните миграции заново.

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '',
'USER': '',
'PASSWORD': '',
'OPTIONS': {
"init_command": "SET storage_engine=MYISAM",
}
}
},

У меня после этого таблица создалась заново и без проблем я смог в нее добавлять и удалять данные!

 

Ваши комментарии

Комментарии могут оставлять только зарегистрированые пользователи!

Disqus - комментарии

blog comments powered by Disqus