2011-01-14 10 views
8

Sto riscontrando un problema con Django 1.2.4.Django: La colonna DatabaseError non esiste

Ecco un modello:

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

Subito dopo il lavaggio del database, io uso il guscio:

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... 

che cosa sto facendo male qui?

Aggiornamento: Se commento lo ForeignKey, il problema scompare.

Update 2: Curiosamente, questo test unità funziona bene:

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

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

Perché funziona qui, ma non nel guscio?

Update 3: La ragione per cui lavora a test di unità, ma non la shell può avere qualcosa a che fare con le diverse banche dati in uso:

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' 
     } 
    } 

Aggiornamento 4: Confermato che quando uso SQLite3 come db, tutto funziona correttamente.

+1

Per essere chiari, hai eseguito 'syncdb' su un database vuoto o modificato manualmente lo schema? Sembra che tu sappia che un modello modificato non aggiornerà automaticamente la tabella ... ma semplicemente assicurandoti che sia – Robert

+0

Sì, ho eseguito 'syncdb'. –

+0

Voglio solo essere sicuro al 100% che non si tratta di un problema di database esistente: hai abbandonato il tuo database Postgres e lo hai ricreato? Ho sicuramente visto problemi persistenti quando le persone provano "flush" o syncdbs parziali. Il motivo per cui lo chiedo è che ciò aumenterebbe la puzza se un semplice modello di campo a 2 non creava colonne correttamente su postgresql_psycopg2. Inoltre, hai controllato se 'foo_foo.bar_id' esiste in' dbshell'? Più informazioni siamo meglio è! –

risposta

9

Provare a eliminare/cancellare completamente il database prima di eseguire syncdb.

Mi ricordo di aver bisogno di farlo un po 'di tempo fa quando ho apportato modifiche ai campi chiave estranei.

+5

È specificato nella documentazione di django che syncdb non modificherà le tabelle esistenti. Quindi, se hai creato le tabelle con syncdb e poi hai modificato alcuni campi cambiando il modello, dovrai eliminare tutto: './manage.py reset myapp' farebbe il trucco. Ovviamente funziona per unittest in quanto le tabelle vengono ricreate ad ogni corsa. –

+1

Se non si desidera ripristinare il db dopo ogni cambio di modello, provare [South] (http://south.aeracode.org/). – Bjorn

0

Ho affrontato lo stesso problema e ho notato che nel database di back-end non esisteva il campo che ospita chiavi esterne. Il problema è scomparso dopo aver creato il campo (che ritengo sia peculiare). Django non sembra creare campi etichettati come chiave esterna. Qualche ragione per cui?

3

Ho risolto questo problema facendo cadere la tabella specifica su quel modello di domanda. Poi utilizzato:

python manage.py syncdb 

Se si utilizza PostgreSQL allora mi consiglia di utilizzare la sua phppgadmin un'interfaccia web simile a phpMyAdmin che viene utilizzato per mySQL.

alternativa all'interfaccia utente si può solo fare da riga di comando

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 

Quando in \ d, sfuggire premendo q.

3

se si utilizza Django 1.8 è necessario creare la colonna. Per essere sicuri di creare la colonna correttamente trovare il file di migrazione in cui è stato creato il campo e si esegue:

./manage.py sqlmigrate app_name migration_name_sans_extension 

Questa uscita volontà i comandi SQL per creare la colonna. Assicurati di includere i comandi che gestiscono le relazioni ed esegui i comandi nella tua console databse. Hai vinto 'devi fare qualcosa di estremo, come far cadere il tavolo o il database.

+0

Puoi dire come dovrebbe apparire la colonna? Ad esempio, ho due colonne ForeignKey: references_by e supported_by che si riferiscono entrambe agli utenti. Vorrei quindi aggiungere altre due colonne: user_referred_by e user_supported_by e avrebbero REFERENCE User (id) ?? Puoi dire dove è contenuto il documento 1.8? – highpost

+1

Ad esempio, sto ancora ricevendo django.db.utils.ProgrammingError: colonna user.referred_by_id non esiste. – highpost

+0

Le colonne faranno riferimento per id a meno che non si specifica un campo to_field. Io non sono sicuro che questo è coperto nella documentazione, ma le informazioni sui campi di FK è qui: https://docs.djangoproject.com/en/1.8/ref/models/fields/#foreignkey –

3

Si prega di leggere questo prima di cadere il vostro intero DB

ho avuto lo stesso problema. Si prega di leggere l'eccezione completamente. Avevo una classe ModelForm che leggeva dalla mia tabella per creare un modulo e c'era un'eccezione. Ho commentato e poi eseguito i makemigrations e funziona completamente. Dopo di ciò ho commentato la classe ModelForm e tutto funziona perfettamente.

Spero che questo aiuti.

Problemi correlati