2011-01-14 23 views
8

Tengo un problema con Django 1.2.4.Django: la columna DatabaseError no existe

Aquí es un modelo:

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

Justo después de tirar de la base de datos, uso el 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... 

¿qué estoy haciendo mal aquí?

Actualización: Si hago un comentario al ForeignKey, el problema desaparece.

Actualización 2: Curiosamente, esta prueba la unidad funciona bien:

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

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

¿Por qué funciona aquí, pero no en la concha?

Actualización 3: La razón por la que trabaja en la unidad de pruebas, pero no la cáscara puede tener algo que ver con las diferentes bases de datos que se utiliza:

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

Actualización 4: Confirmó que cuando uso SQLite3 como db, todo funciona bien.

+1

Para ser claros, ha ejecutado 'syncdb' en una base de datos vacía, o ha editado manualmente el esquema? Parece que eres consciente de que un modelo modificado no actualizará automáticamente la tabla ... pero solo asegúrate de – Robert

+0

Sí, ejecuté 'syncdb'. –

+0

Solo quiero estar 100% seguro de que no es un problema de base de datos existente: ¿ha descartado su base de datos de postgres y la ha vuelto a crear? Definitivamente he visto problemas persistentes cuando las personas intentan 'flush' o syncdbs parciales. La razón por la que pregunto es porque esto levantaría una peste si un simple 2 modelo de campo no creara columnas correctamente en postgresql_psycopg2. Además, ¿ha comprobado si 'foo_foo.bar_id' existe en' dbshell'? ¡Cuanta más información, mejor! –

Respuesta

9

Intente dejar/borrar completamente la base de datos antes de ejecutar syncdb.

Recuerdo que tenía que hacer eso hace un tiempo cuando había hecho cambios en campos de claves externas.

+5

Se especifica en la documentación de django que syncdb no modificará las tablas existentes. Entonces, si creó las tablas con syncdb y luego modificó algunos campos cambiando el modelo, tendrá que dejar todo: './manage.py reset myapp' haría el truco. Obviamente funciona para unittest ya que las tablas se recrean en cada ejecución. –

+1

Si no desea restablecer su base de datos después de cada cambio de modelo, intente con [South] (http://south.aeracode.org/). – Bjorn

0

Me enfrenté al mismo problema y me di cuenta de que en la base de datos back-end no existía el campo que aloja las claves externas. El problema desapareció después de que creé el campo (que creo que es peculiar). Django no parece crear un campo etiquetado como clave externa. ¿Alguna razón por qué?

3

Resolví este problema dejando caer la tabla específica a ese modelo de pregunta. A continuación, se utiliza:

python manage.py syncdb 

Si utiliza PostgreSQL, te recomiendo el uso de su phpPgAdmin una interfaz web similar a phpMyAdmin que se utiliza para MySQL.

alternativa a la interfaz de usuario que acaba puede hacer línea de comandos

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 

Cuando en \ d, escapar pulsando q.

3

si está utilizando Django 1.8 debe crear la columna. Para asegurarse de que se crea la columna correctamente encontrar el archivo de migración en la que creó el campo y ejecutar:

./manage.py sqlmigrate app_name migration_name_sans_extension 

Esta es la salida los comandos SQL para crear la columna. Asegúrese de incluir los comandos que manejan las relaciones y ejecutar los comandos en su consola de databse. No tendrá que hacer nada extremo, como dejar caer la mesa o la base de datos.

+0

¿Puedes decir cómo debería ser la columna? Por ejemplo, tengo dos columnas ForeignKey: referido por y admitido por el cual ambos se refieren a los Usuarios. Luego, agregaría dos columnas más: user_referred_by y user_supported_by y se REFERENCE User (id) ?? ¿Puedes decirnos en qué parte de los documentos de 1.8 está cubierto? – highpost

+1

Por ejemplo, sigo recibiendo django.db.utils.ProgrammingError: la columna user.referred_by_id no existe. – highpost

+0

Las columnas harán referencia por id a menos que especifique un campo to_field. No estoy seguro de que esto esté cubierto en los documentos, pero la información en los campos FK está aquí: https://docs.djangoproject.com/en/1.8/ref/models/fields/#foreignkey –

3

Por favor lea esto antes de caer toda su base de datos

tuve misma edición. Por favor, lea la excepción por completo. Tenía una clase de ModelForm que leía desde mi tabla para crear un formulario y la excepción estaba allí. Comenté y luego ejecuté makemigrations y funcionó por completo. Después de eso, comencé la clase ModelForm y todo funciona perfectamente.

Espero que esto ayude.

Cuestiones relacionadas