Cómo depurar: se anula la transacción actual de error interno, se ignoran los comandos hasta el final del bloque de transacción

Hola gente Stackoverflow,

Hago mis primeros pasos con GeoDjango y estoy buscando mejores opciones para verificar las declaraciones de SQL defectuosas.

Hasta ahora, simplemente quería asegurar un punto lng + lat en mi tabla postgresql.

El modelo se define con:

geolocation = models.PointField(_('Geo Location'), geography=True, null = True, blank = True, help_text=_('Geolocation with Longitude and Latitude')) objects = models.GeoManager() 

En mi opinión, bash ejecutar el siguiente comando

 savedProject.geolocation = GEOSGeometry('POINT(%s %s)' %(u_lng,u_lat)) 

pero recibo el siguiente error cuando bash guardar el formulario:

Tipo de excepción: InternalError Valor de excepción: la transacción actual se cancela, los comandos se ignoran hasta el final del bloque de transacción

¿Cuál es la razón de este error? Creo que podría haber algo mal con la statement de SQL, pero ¿cuál es la mejor manera de verificar? Django solo proporciona el mensaje de error general “Error interno”.

Gracias por su ayuda y sugerencias!

En la mayoría de los casos, esto significa que la instrucción SQL anterior no se ejecutó. En este caso deberías:

  1. Habilite el registro de SQL , vea el siguiente fragmento de código para pegar en settings.py

  2. Establecer DEBUG = 1 , o SQL no será registrado

  3. Ejecute runserver de nuevo , y debería ver todas las consultas SQL en la consola

  4. Ejecute las últimas consultas SQL directamente en su base de datos , luego debe encontrar qué consultas fallan y luego debe poder depurarlas, o abrir una nueva pregunta que sea específica a la consulta que causa el problema. Puede usar phpMyAdmin, o directamente un cliente CLI, o cualquier otro cliente de base de datos, para ejecutar las consultas SQL una por una hasta que encuentre la que necesita algo de amor.

Configuración de registro SQL:

 LOGGING = { 'version': 1, 'disable_existing_loggers': True, 'formatters': { 'simple': { 'format': '%(levelname)s %(message)s', }, }, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', 'formatter': 'simple' }, }, 'loggers': { 'django': { 'handlers': ['console'], 'level': 'DEBUG', }, } } 

Si esta configuración no proporciona ningún resultado de consola adicional con runserver , no dude en probar el ejemplo de proyecto de prueba de django-autocomplete-light :

  1. Lee y pega los comandos de instalación en /tmp

  2. Cambie dir a autocomplete_light_env/src/django-autocomplete-light/test_project

  3. Abra test_project/settings.py , reemplace la configuración de LOGGING por la de arriba

  4. Runserver y abra su navegador

Su consola se verá como:

 Validating models... 0 errors found Django version 1.4.1, using settings 'test_project.settings' Development server is running at http://127.0.0.1:8000/ Quit the server with CONTROL-C. DEBUG (0.001) SELECT "django_content_type"."id", "django_content_type"."name", "django_content_type"."app_label", "django_content_type"."model" FROM "django_content_type" WHERE ("django_content_type"."model" = taggable AND "django_content_type"."app_label" = charfield_autocomplete ); args=('taggable', 'charfield_autocomplete') DEBUG (0.000) SELECT DISTINCT "tagging_tag".id, "tagging_tag".name FROM "tagging_tag" INNER JOIN "tagging_taggeditem" ON "tagging_tag".id = "tagging_taggeditem".tag_id INNER JOIN "charfield_autocomplete_taggable" ON "tagging_taggeditem".object_id = "charfield_autocomplete_taggable"."id" WHERE "tagging_taggeditem".content_type_id = 11 GROUP BY "tagging_tag".id, "tagging_tag".name ORDER BY "tagging_tag".name ASC; args=[]