2012-01-30 21 views
14
personas

Hola Stackoverflow,Cómo depurar: se aborta Error interno transacción actual, los comandos ignorado hasta el final del bloque de transacción

hago mis primeros pasos con GeoDjango y estoy en busca de mejores opciones para comprobar las sentencias SQL defectuosos.

Hasta ahora, simplemente quería asegurar un punto lat + 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, trato de ejecutar el siguiente comando

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

pero recibo el siguiente error cuando trato de guardar el formulario:

Tipo de excepción: InternalError Excepción Valor: la transacción actual es abortado, comandos ignorados 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 declaración 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!

Respuesta

27

En la mayoría de los casos, esto significa que la instrucción SQL anterior no se pudo ejecutar. En este caso se debe:

  1. Enable SQL logging, consulte el siguiente fragmento de pegar en settings.py

  2. de depuración SET = 1, o SQL no se registrará

  3. Run de ejecución del servidor 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, entonces debería encontrar qué consultas fallan y luego debería poder depurarlas, o abrir una nueva pregunta que sea específica de la consulta que causa el problema. Puede usar phpMyAdmin, o directamente un cliente CLI, o cualquier cliente de base de datos, para ejecutar las consultas SQL una por una hasta que encuentre la que necesita un poco 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 ninguna salida de la consola adicional runserver, entonces no dude en probar django-autocomplete-light's example test_project:

  1. Lea y pegar la instalación comandos en /tmp

  2. Cambio dir para autocomplete_light_env/src/django-autocomplete-light/test_project

  3. abierto test_project/settings.py, reemplazar la configuración LOGGING por la anterior

  4. de ejecución del servidor y abrir su navegador

Su consola se verá así:

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=[] 
+1

Su configuración de registro de SQL sugerida no proporciona ningún complemento registro de la consola de iones para mí. Tengo DEBUG = True, así que no estoy seguro de qué más intentar ver realmente el SQL. Tuve un error en mi llamada .extra(), mi donde tenía un error tipográfico. Me llevó varias horas darme cuenta. Hubiera sido pan comido si hubiera podido ver el SQL que estaba generando. Me solucionaron mi problema, pero Django no estaba seguro. – gdonald

+2

Estoy dando +1 a su respuesta, debido a "En la mayoría de los casos esto significa que la instrucción SQL anterior no se pudo ejecutar". fue exactamente el caso para mi problema. El seguimiento de pila mostraba un objeto que no se guardaba, pero en realidad era una consulta sobre él. Según mi experiencia, los rastros de pila de Django no son útiles en la mayoría de los casos. – gdonald

+0

Estoy preocupado por "no proporciona ** ningún registro de consola adicional **". Así que actualicé la respuesta para incluir una forma fácil de probar esta configuración de REGISTRO. Esto le permite saber si esto proviene de su proyecto (¿configuración?) O del entorno. – jpic

Cuestiones relacionadas