Ich habe ein Problem mit Django 1.2.4. HierDjango: DatabaseError Spalte existiert nicht
ist ein Modell:
class Foo(models.Model):
# ...
ftw = models.CharField(blank=True)
bar = models.ForeignKey(Bar, blank=True)
Gleich nach der Datenbank Spülung benutze ich die Schale:
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...
Was mache ich falsch hier?
Aktualisieren: Wenn ich die ForeignKey
auskommentieren, verschwindet das Problem.
Update 2: Merkwürdigerweise funktioniert dieses Gerät Test ganz gut:
def test_foo(self):
f = Foo()
f.save()
self.assertTrue(f in Foo.objects.all())
Warum es hier aber nicht in der Shell funktioniert?
Update 3: Der Grund, warum es in Unit-Tests funktioniert, jedoch nicht die Schale etwas mit den verschiedenen Datenbanken zu tun haben, verwendet werden:
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'
}
}
Update 4: Bestätigt, dass alles funktioniert, wenn ich SQLite3 als db benutze.
Um klar zu sein, haben Sie 'syncdb' in einer leeren Datenbank ausgeführt oder das Schema von Hand bearbeitet? Es scheint, als ob Sie wissen, dass ein modifiziertes Modell die Tabelle nicht automatisch aktualisiert ... aber nur dafür sorgen, – Robert
Yeah, ich lief 'Syncdb'. –
Ich möchte nur 100% sicher sein, dass es kein bestehendes Datenbankproblem ist: Haben Sie Ihre Postgres-Datenbank gelöscht und neu erstellt? Ich habe auf jeden Fall anhaltende Probleme gesehen, wenn Leute 'flush' oder teilweise syncdbs versuchen. Der Grund, den ich frage, ist, weil dies einen Gestank auslösen würde, wenn ein einfaches 2-Feld-Modell Spalten auf postgresql_psycopg2 nicht korrekt erstellt hätte. Haben Sie auch überprüft, ob 'foo_foo.bar_id' in' dbshell' existiert? Je mehr Infos, desto besser! –