sql >> Base de Datos >  >> RDS >> PostgreSQL

valor demasiado largo para tipo de carácter que varía (100)----base de datos cambiada recientemente, no hizo nada en db

No creo que necesite ayuda para solucionar este problema, tanto como necesita ayuda para depurarlo. Una vez que el problema está claro, la solución también parece clara. El Traceback es quizás un poco confuso porque está pasando por mucho código fuente de Django y no le dice cuál de sus campos tiene un problema.

Antecedentes de este problema

Para empezar, tenemos problemas para guardar una Post instancia. Bueno, mira todos estos campos que tienes en la definición de tu modelo:

 ...
  url = models.URLField(max_length=250, blank=True, null=True)
  video = EmbedVideoField(verbose_name='link',help_text="Youtube", blank=True, null=True) 
  content = RichTextUploadingField(config_name='default')
  image = models.ImageField(upload_to='images',blank=True, null=True)
  thumbnail = models.ImageField(upload_to='images', blank=True, null=True)

Estos pueden no parecer campos de texto, pero muchos de ellos son variaciones de los campos de texto porque, si lo piensa bien, probablemente no almacenará archivos completos en su base de datos. Lo que hará en su lugar (y lo que hace Django de forma predeterminada) es almacenar el archivo en algún lugar de algún disco y luego en la base de datos almacenaría la ruta a ese archivo para que pueda recuperarlo cuando lo necesite.

Además, probablemente sea un desperdicio almacenar rutas de archivos en la base de datos como LongText o lo que sea, por lo que cada FileField tenemos significa que tenemos un campo con una max_length lo especifiquemos o no. Por lo tanto, todos los campos anteriores tienen un max_length implícito . De hecho, puedes averiguarlo leyendo el código fuente de Django.

Ejemplos de fuentes

Nunca he usado EmbedVideoField , por ejemplo, pero resulta ser una subclase de models.URLField , lo que significa que tiene una max_length por defecto establecido en 200 si no especifica uno.

Además, sus diversos ImageField s son solo subclases de FileField , que tiene un max_length predeterminado de 100 .

¿Cómo depurar problemas como este en el futuro?

Ahora bien, esto no nos ayuda a saber cuál de sus campos arroja un error en este caso. Para eso, probablemente establecería un punto de interrupción en algún lugar del código, probablemente aquí:

File "ebagu/main/models.py" in save
   66.       super(Post, self).save(*args, **kwargs)

Por "establecer un punto de interrupción", me refiero a lo siguiente:

Vaya a la línea 65 en el módulo mencionado anteriormente, ebagu/main/models.py e ingrese lo siguiente y guarde el módulo:import pdb; pdb.set_trace()

(De hecho, tengo una fuerte preferencia por ipdb mismo, pero eso requiere Ipython, que también tengo una fuerte preferencia por...)

Ejecute su servidor local y siga los pasos que produjeron este problema. Terminará enviando su formulario y, si observa la consola donde inició su servidor, eventualmente se le descargará en un shell justo en la línea 65. Este shell es un cáscara de pdb , que tiene reglas diferentes a las de un shell normal, pero puede evaluar su Post a punto de ser guardado instancia, observando los diversos campos en la instancia misma, self y ejecutar el código de Python en el contexto de esa llamada de método:

(pdb) len(self.image.path)

Usando eso, evaluaría manualmente los diversos campos y vería cuál tiene esta entrada realmente larga que está bloqueando el guardado (probablemente uno de sus ImageField s).

Solución con Advertencias

Alternativamente, puede simplemente agregar un max_length a todos estos, pero tenga en cuenta que lo más probable es que necesite realizar migraciones de bases de datos para cualquier campo de texto limitado que cambie porque su base de datos aún verificará la longitud de la entrada con respecto a cómo se define la columna. Aquí hay una buena respuesta de StackOverflow que analiza exactamente este problema .

Nota al pie

¿Por qué no surgió esto antes de cambiar a Postgresql? Hay una variedad de razones potenciales, pero probablemente tenga que ver con cómo se configuró la base de datos anterior frente a cómo se configuró la base de datos de Postgresql (¿manualmente frente a las migraciones de Django?).

También puede tener que ver con si cambió o no dónde se almacenan estas cosas. ¿Cambió su MEDIA configuración para que las rutas donde se almacenan los archivos sean mucho más largas?

Lo que realmente debería estar haciendo es mirar directamente a su base de datos. Abre un psql instancia y pídale que le describa sus tablas. Le dirá qué campos están limitados a 100 caracteres y esos son los campos que le dan problemas.