2011-01-14 4 views
8

У меня проблема с Django 1.2.4.Django: столбец DatabaseError не существует

Вот модель:

class Foo(models.Model): 
    # ... 
    ftw = models.CharField(blank=True) 
    bar = models.ForeignKey(Bar, blank=True) 

Сразу после промывки базы данных, я использую оболочку:

Python 2.6.6 (r266:84292, Sep 15 2010, 15:52:39) 
[GCC 4.4.5] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
(InteractiveConsole) 
>>> from apps.foo.models import Foo 
>>> Foo.objects.all() 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 67, in __repr__ 
    data = list(self[:REPR_OUTPUT_SIZE + 1]) 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 82, in __len__ 
    self._result_cache.extend(list(self._iter)) 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 271, in iterator 
    for row in compiler.results_iter(): 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/compiler.py", line 677, in results_iter 
    for rows in self.execute_sql(MULTI): 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/compiler.py", line 732, in execute_sql 
    cursor.execute(sql, params) 
    File "/usr/local/lib/python2.6/dist-packages/django/db/backends/util.py", line 15, in execute 
    return self.cursor.execute(sql, params) 
    File "/usr/local/lib/python2.6/dist-packages/django/db/backends/postgresql_psycopg2/base.py", line 44, in execute 
    return self.cursor.execute(query, args) 
DatabaseError: column foo_foo.bar_id does not exist 
LINE 1: ...t_omg", "foo_foo"."ftw", "foo_foo... 

Что я делаю неправильно здесь?

Обновление: Если я прокомментирую ForeignKey, проблема исчезнет.

Update 2: Любопытно, что этот тест устройство работает просто отлично:

def test_foo(self): 
    f = Foo() 
    f.save() 

    self.assertTrue(f in Foo.objects.all()) 

Почему это работает здесь, но не в оболочке?

Update 3: Причина, по которой работает в модульном тестировании, но не оболочка может иметь что-то делать с различными базами данных используются:

settings.py:

DATABASES = { 
    'default': { 
     'ENGINE': 'postgresql_psycopg2', 
     'NAME': 'foo', 
     'USER': 'bar', 
     'PASSWORD': 'baz', 
     'HOST': '', 
     'PORT': '', 
    } 
} 

import sys 
if 'test' in sys.argv or True: 
    DATABASES = { 
     'default': { 
      'ENGINE': 'django.db.backends.sqlite3', 
      'NAME': 'testdb' 
     } 
    } 

Обновление 4: Подтверждено, что, когда я использую SQLite3 как db, все работает нормально.

+1

Чтобы быть понятным, вы запустили 'syncdb' в пустой базе данных или вручную отредактировали схему? Похоже, вы знаете, что модифицированная модель не будет автоматически обновлять таблицу ... но просто убедитесь, что – Robert

+0

Да, я запустил 'syncdb'. –

+0

Я просто хочу быть на 100% уверен, что это не проблема с существующей базой данных: вы отбросили свою базу данных postgres и заново создали ее? Я определенно видел затяжные проблемы, когда люди пытаются «очистить» или частично синхронизировать. Причина, по которой я спрашиваю, заключается в том, что это повысит вонь, если простая 2-полевая модель неправильно создала столбцы на postgresql_psycopg2. Кроме того, вы проверили, существует ли 'foo_foo.bar_id' в' dbshell'? Чем больше информации, тем веселее! –

ответ

9

Попробуйте полностью удалить/стереть базу данных перед запуском syncdb.

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

+5

В документации django указано, что syncdb не будет изменять существующие таблицы. Поэтому, если вы создали таблицы с syncdb, а затем изменили некоторые поля, изменив модель, вам нужно будет отбросить все: './manage.py reset myapp' будет делать трюк. Очевидно, он работает для unittest, поскольку таблицы воссоздаются при каждом запуске. –

+1

Если вы не хотите перезагружать свой db после каждого изменения модели, попробуйте [Юг] (http://south.aeracode.org/). – Bjorn

0

Я столкнулся с той же проблемой и заметил, что в базе данных бэкэнда поле, в котором хранятся внешние ключи, не существует. Проблема исчезла после того, как я создал поле (что, по-моему, своеобразно). Кажется, что Django не создает поле, помеченное как внешний ключ. Почему?

3

Я исправил эту проблему, отбросив конкретную таблицу на эту модель вопроса. Затем используется:

python manage.py syncdb 

Если вы используете PostgreSQL, то я рекомендую использовать PhpPgAdmin свой веб-интерфейс, похожий на PhpMyAdmin, который используется для MySql.

альтернатива пользовательского интерфейса вы можете просто сделать Командная строка

su postgres #change user to postgres 
psql <datebase> #access shell for <datebase> database 
\d #list all tables 
DROP TABLE "" CASCADE #select a table to drop 
\q #exit shell 

Когда в \ д, бежать, нажав д.

3

Если вы используете Django 1.8, вы должны создать столбец. Для того, чтобы убедиться, что вы создаете столбец правильно найти файл переноса, в котором вы создали поле и выполните команду:

./manage.py sqlmigrate app_name migration_name_sans_extension 

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

+0

Можете ли вы сказать, как должна выглядеть колонка? Например, у меня есть два столбца ForeignKey: refer_by и supported_by, которые оба относятся к Пользователям. Затем я добавлю еще два столбца: user_referred_by и user_supported_by, и они будут ССЫЛКИ User (id) ?? Можете ли вы сказать, где в 1.8 документах это покрывается? – highpost

+1

Например, я все еще получаю django.db.utils.ProgrammingError: column user.referred_by_id не существует. – highpost

+0

Столбцы будут ссылаться по идентификатору, если вы не укажете поле to_field. Я не уверен, что это описано в документах, но информация о полях FK находится здесь: https://docs.djangoproject.com/en/1.8/ref/models/fields/#foreignkey –

3

Пожалуйста, прочитайте это, прежде чем упасть весь DB

У меня был такой же вопрос. Пожалуйста, прочитайте исключение полностью. У меня был класс ModelForm, который читал из моей таблицы, чтобы создать форму, и там было исключение. Я прокомментировал, а затем запустил makemigrations и работал полностью. После этого я прокомментировал класс ModelForm, и все работает отлично.

Надеюсь, это поможет.

Смежные вопросы