Msgstr "Ошибка базы данных, столбец не существует". Но показывает в моем manage.py sql - PullRequest
3 голосов
/ 10 февраля 2012

Относительно Django & Python:

Ошибка:

Тип исключения: DatabaseError Значение исключения:
column object_thing.name_id не существует LINE 1: ... s_thing"." созданы "," объекты_ты "." изменены "," объекты ...

В моих файлах manage.py sql

CREATE TABLE "objects_thing" (
    otherstuff,
    otherstuff,
    "name_id" integer NOT NULL REFERENCES "profiles_name" ("id"),
    otherstuff,
);

Таким образом, он явно существует.Я запустил syncdb.Почему я получаю эту ошибку?И как мне это исправить?(Я новичок во всем этом) Заранее спасибо за помощь.

РЕДАКТИРОВАТЬ:

Модель Вещь:

class Thing(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)
    name = models.ForeignKey(Name)#The name for this thing
    current_allocation = models.DecimalField(max_digits=13, decimal_places=2, null=True, blank=True)
    target_allocation = models.DecimalField(max_digits=13, decimal_places=2, null=True, blank=True)
    placeholder = models.ForeignKey(Entity, null=True, blank=True, on_delete=models.SET_NULL)
    avatar = models.ImageField(upload_to='avatars/thing/', null=True, blank=True)

Ответы [ 2 ]

5 голосов
/ 10 февраля 2012

syncdb не изменяет существующие таблицы в вашей базе данных, поэтому, если вы запустите это, а затем измените свою модель, ваша модель теперь не синхронизирована с таблицей, которую она представляет.Повторный запуск syncdb не исправит это.

Вам либо нужно использовать что-то вроде south , чтобы выполнить миграцию, удалите таблицу из вашей БД, чтобы syncdb воссоздала ее,или вручную запустите ALTER TABLE в вашей БД.

EDIT (более подробно)

Когда вы создаете подкласс Model в models.py, он действует как представление таблицы базы данных, но не имеет автоматически таблицы базы данных.Вы получите это, запустив python manage.py syncdb.Затем Django просматривает все ваши файлы models.py, генерирует SQL, необходимый для создания такой таблицы, и затем запускает ее в вашей базе данных.В результате вы получаете реальные таблицы базы данных, связанные с вашими моделями.

Однако syncdb only создает таблиц.Это не меняет их.Таким образом, если вы перейдете и измените одну из своих моделей (добавьте поле, измените имя поля и т. Д.), На уровне базы данных ничего не произойдет.Повторный запуск syncdb также не поможет, поскольку нет новых таблиц для создания.Вы должны каким-то образом получить таблицу, соответствующую модели, и наоборот, так что вот где ваши варианты:

  1. Использовать Юг (ссылка выше).Юг позволяет вам создавать миграций , поэтому, когда вы что-то изменяете в своих моделях, вы можете запустить:

    python manage.py schemamigration --auto yourapp
    

    И он сгенерирует код, который изменит таблицу в соответствии с вашей моделью.Затем вам нужно только применить миграцию с:

    python manage.py migrate yourapp
    

    И все готово.Теперь таблица соответствует вашей модели, и все снова в мире.

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

    python manage.py syncdb
    

    Поскольку таблица больше не существует, Django создаст ее, но создаст на основе состояния вашей текущей модели.Итоговый результат одинаков, ваша модель и таблица соответствуют друг другу, поэтому вы можете продолжать.

  3. Вы можете вручную изменить таблицу.Это требует, чтобы вы выяснили, какой SQL нужно применять, чтобы изменить таблицу в соответствии с вашей моделью.Вы запускаете этот SQL в своей базе данных, и тогда таблица находится в соответствии с моделью.

Дело в том, что каким-то образом вы должны обновить таблицу, чтобы отразить любые сделанные вами измененияк вашим моделям.Модель - это не таблица, а ее программное представление.

1 голос
/ 10 февраля 2012

Столбец может не существовать обязательно. Команда sql просто показывает sql, использованный для его создания, она основана на вашей текущей модели. Вы можете удалить таблицу и повторно syncdb или вручную добавить столбец. https://docs.djangoproject.com/en/dev/ref/django-admin/#sql-appname-appname

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

Модель Django - это всего лишь некоторый код Python. Это объект Python, который связан с таблицей SQL. База данных базы данных указана в файле settings.py. База данных содержит актуальную таблицу. Ошибка, с которой вы столкнулись, указывает на то, что модель python отличается от фактической таблицы базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...