Django: DatabaseError la colonne n'existe pas
Je vais avoir un problème avec Django 1.2.4.
Ici est un modèle:
class Foo(models.Model):
# ...
ftw = models.CharField(blank=True)
bar = models.ForeignKey(Bar, blank=True)
Droite après la purge de la base de données, j'utilise le shell:
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...
Ce que je fais mal?
Mise à jour: Si j'commentaire la ForeignKey
, le problème disparaît.
Mise à jour 2: Curieusement, ce test fonctionne très bien:
def test_foo(self):
f = Foo()
f.save()
self.assertTrue(f in Foo.objects.all())
Pourquoi ça fonctionne ici, mais pas dans le shell?
Mise à jour 3: La raison pour laquelle il travaille dans l'unité de test, mais pas de la coque peut avoir quelque chose à voir avec les différentes bases de données utilisées:
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'
}
}
Mise à jour 4: Confirmé que, lorsque je utiliser SQLite3 que la db, tout fonctionne bien.
Pour être clair, vous n'avez
Ouais, j'ai couru
Je veux juste être sûr à 100%, ce n'est pas une base de données existante question: avez-vous abandonné votre base de données postgres et re-créé? J'ai certainement vu persistante questions quand les gens essaient
"colonne foo_foo.bar_id n'existe pas" - est-il un tableau "foo_foo" avec une colonne "bar_id"?
Une alternative à la réinitialisation de la bd (comme Bjorn correctement points) est à utiliser dans le Sud pour les migrations - south.aeracode.org/docs/installation.html. Il est extrêmement simple à utiliser et si vous avez besoin d'un guide étape par étape, c'est un bon post à lire: mitchfournier.com/2010/06/23/...
syncdb
sur une base de données vide, ou de la main-d'éditer le schéma? Il semble que vous êtes au courant qu'un modèle modifié de ne pas mettre à jour automatiquement la table... mais seulement de s'assurer queOuais, j'ai couru
syncdb
.Je veux juste être sûr à 100%, ce n'est pas une base de données existante question: avez-vous abandonné votre base de données postgres et re-créé? J'ai certainement vu persistante questions quand les gens essaient
flush
ou partielle syncdbs. La raison que je demande, c'est parce que cela susciterait une puanteur si un simple 2 modèle de champ n'ai pas de créer des colonnes correctement sur postgresql_psycopg2. Aussi, avez-vous vérifié si foo_foo.bar_id
existe dans dbshell
? L'info plus on est de fous!"colonne foo_foo.bar_id n'existe pas" - est-il un tableau "foo_foo" avec une colonne "bar_id"?
Une alternative à la réinitialisation de la bd (comme Bjorn correctement points) est à utiliser dans le Sud pour les migrations - south.aeracode.org/docs/installation.html. Il est extrêmement simple à utiliser et si vous avez besoin d'un guide étape par étape, c'est un bon post à lire: mitchfournier.com/2010/06/23/...
OriginalL'auteur Nick Heiner | 2011-01-14
Vous devez vous connecter pour publier un commentaire.
Essayez complètement tomber/essuyage de la base de données avant d'exécuter syncdb.
Je me souviens avoir besoin de faire un retour alors que quand j'avais fait des changements de champs de clé étrangère.
./manage.py reset myapp
ferait l'affaire. Il fonctionne évidemment pour unittest que les tables sont recréés à chaque run.Si vous ne voulez pas réinitialiser votre base de données après chaque changement de modèle, essayer Sud.
OriginalL'auteur amcashcow
Veuillez Lire ceci avant de vous déposer l'ensemble de votre DB
J'ai eu même problème. Veuillez lire l'exception complètement. J'ai eu un ModelForm de la classe de lire ma table pour créer une forme et d'exception était là. J'ai fait des observations et ensuite exécuter le makemigrations et fonctionne complètement. Après que j'ai commenté le ModelForm classe et tout fonctionne parfait.
Espère que cette aide.
OriginalL'auteur Ali
J'ai résolu ce problème en supprimant la table spécifique à ce modèle de question. Alors utilisés:
Si vous utilisez PostgreSQL alors je vous recommande d'utiliser phppgadmin son d'une interface web semblables à PHPmyadmin qui est utilisé pour mySQL.
Alternative à l'interface utilisateur, vous pouvez le faire en ligne de commande
Lorsque \d, échappement en appuyant sur q.
OriginalL'auteur Alex Stewart
si vous utilisez Django 1.8 vous devez créer la colonne. Assurez-vous de créer la colonne correctement trouver le fichier de migration dans lequel vous avez créé le champ et course:
Ceci affichera les commandes sql pour créer la colonne. Assurez-vous d'inclure les commandes gérer les relations et exécuter les commandes dans votre databse de la console. Vous n'avez pas à faire quelque chose d'extrême, comme la suppression de la table ou de la base de données.
Par exemple, je suis encore en train de django.db.utils.ProgrammingError: colonne de l'utilisateur.referred_by_id n'existe pas.
Les colonnes de référence par id, sauf si vous spécifiez un to_field champ. Je ne suis pas sûr de ce qui est couvert dans les docs, mais l'information sur FK champs est ici: docs.djangoproject.com/en/1.8/ref/models/fields/#foreignkey
Ce doit être la accepté de répondre, car il s'applique aux versions modernes de Django et de toutes les autres réponses sont vraiment pas adaptés pour travailler avec des tables de base de données, vous ne pouvez vraiment pas se permettre de laisser.
OriginalL'auteur Ernest Jumbe
J'ai connu le même problème et a remarqué que dans le backend de base de données le terrain qui abrite les clés étrangères n'existe pas. Le problème a disparu après que j'ai créé le champ (ce qui je pense est propre). Django ne semble pas créer de champ étiquetés comme clé Étrangère. Quelle en est la raison?
OriginalL'auteur melsk