Django - устаревшая база данных и проблемы с полем 'id' - PullRequest
5 голосов
/ 21 сентября 2011

Я интегрирую базу данных MySQL из приложения php в новый проект Django. Inspectdb работал хорошо, мне просто нужно было изменить пару полей на ForeignKeys, и теперь все чтение и редактирование текущих данных работает отлично.

Проблема в том, что когда я пытаюсь создать новую запись, я получаю сообщение об ошибке "Field 'id' doesn't have a default value". Трассировка начинается с вызова form.save(), а исключение исходит от курсора MySQL. В большинстве случаев столбец имеет имя id, но в одном случае это именованное значение:

class ModelOne(models.Model): #normal "id" named pk 
    id = models.AutoField(primary_key=True, db_column='id', default=None)
    other_fields = ...

class ModelTwo(models.Model): #specific pk
    named_pk = models.AutoField(primary_key=True, db_column='named_pk',
                                default=None)
    other_fields = ...

Для ModelTwo, когда я размещаю правильную форму, я получаю сообщение об ошибке, но затем, если я возвращаюсь к своему списку данных, появляется новый элемент! И после того, как я проверил последние значения id в оболочке, я вижу, что они правильно увеличиваются.

Но для ModelOne (с id) ошибка все еще появляется, и pk становится 2147483647 (макс.), И последующие сохранения завершаются ошибкой из-за дублирования идентификаторов. (следующий самый высокий pk - только 62158)

Что мне нужно сделать, чтобы эти поля идентификаторов работали правильно?


обновление: все еще не повезло, исправляя это Думая о выгрузке данных и импорте их в свежие, построенные Django таблицы. Все еще ищу решение этой проблемы.


Update2: Информация от db shell

ModelOne:

+-------------+--------------+-------+------+---------+-----------------+
| Field       | Type         | Null  | Key  | Default | Extra           |
| id          | int(11)      | NO    | PRI  | NULL    | auto_increment  |

ModelTwo:

+-------------+--------------+-------+------+---------+-----------------+
| Field       | Type         | Null  | Key  | Default | Extra           |
| named_pk    | int(11)      | NO    | PRI  | NULL    | auto_increment  |

Ответы [ 3 ]

5 голосов
/ 20 августа 2012

Я встретил ту же проблему после некоторой сложной миграции на юг. Мы хотели избежать перезагрузки базы данных (dump / import), к счастью, это поможет другим людям, которые попадают в этот пост после поиска той же проблемы.

Мы нашли решение, которое решает эту проблему без необходимости экспорта и импорта базы данных.

Для таблицы с именем auth_user следующая команда MySQL исправит указанное выше сообщение об ошибке:

ALTER TABLE auth_user MODIFY `id` INT(11) NOT NULL AUTO_INCREMENT;

оригинальное решение от:

http://webit.ca/2012/01/field-id-doesnt-have-a-default-value/

3 голосов
/ 22 сентября 2011

Имеет смысл определить pk для ModelTwo (как вы уже делаете), потому что ваш pk имеет другое имя named_pk.Тем не менее, нет необходимости явно определять «id» как ваш pk для ModelOne.Django создаст столбец идентификаторов по умолчанию.Поэтому вообще не определяйте столбец id для ModelOne.

ОБНОВЛЕНИЕ: Удалите "default = None" из модели и NULL по умолчанию из базы данных для ModelTwo для named_pk

1 голос
/ 29 сентября 2011

В итоге я экспортировал данные из исходной базы данных и загрузил их в новую базу данных, сгенерированную моими моделями / проектом.

Я думаю, что перепробовал слишком много вещей с копией исходной базы данных, над которой работал, и испортил базовый SQL для поля pk.

Я просто рад, что работал только с копией.

...