2012-01-30 174 views
14

嗨#1人,如何调试:内部错误当前事务被中止,忽略,直到事务块结束

我做我与GeoDjango内置的第一步,我期待更好的选项,以检查故障的SQL语句命令。

到目前为止,我只是想在我的postgresql表中安全lng + lat点。

模型与定义:

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

    objects = models.GeoManager() 

在我看来,我尝试执行以下命令

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

,但我收到以下错误,当我尝试保存表单:

异常类型:InternalError 异常值:当前事务为 中止,命令被忽略,直到交易块结束

这个错误的原因是什么?我相信sql语句可能有问题,但是最好的检查方法是什么? Django仅提供一般错误消息“内部错误”。

谢谢您的帮助和建议!

回答

27

在大多数情况下,这意味着以前的 SQL语句未能执行。在这种情况下,你应该:

  1. 启用SQL logging,请参阅下面的代码片段在settings.py粘贴

  2. 设置调试= 1,或SQL将不记录

  3. 再次运行runserver,并且您应该看到控制台中的所有SQL查询

  4. 直接在您的数据库中执行最后的SQL查询,您应该找到哪些查询失败,然后您应该能够调试它们 - 或者打开一个新的问题,这个问题是特定于导致问题的查询的。您可以使用phpMyAdmin或直接CLI客户端或任何数据库客户端逐个执行SQL查询,直到找到需要一些爱的那个。

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

如果这个配置不提供runserver任何额外的控制台输出,然后随意尝试django-autocomplete-light's example test_project

  1. 阅读并粘贴安装/tmp

  2. 更改目录到autocomplete_light_env/src/django-autocomplete-light/test_project

  3. 打开test_project/settings.py,由一个替换LOGGING配置上面

  4. RUNSERVER,打开你的浏览器

您的控制台看起来像:

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

您建议的SQL日志记录配置不提供任何addit离子控制台为我记录。我有DEBUG = True,所以我不知道还有什么可以尝试实际看到SQL。我在我的.extra()调用中出错,我的地方有一个错字。花了我几个小时才注意到它。如果我能看到我生成的SQL,那将是一块蛋糕。我解决了我的问题,但Django肯定没有帮助。 – gdonald 2012-10-20 16:25:43

+2

我给你的答案+1,因为“在大多数情况下,这意味着以前的SQL语句执行失败。”我的问题就是这样。堆栈跟踪显示一个对象无法保存,但它实际上是一个查询。根据我的经验,在大多数情况下,Django堆栈跟踪根本没有帮助。 – gdonald 2012-10-20 16:30:49

+0

我专注于“不提供**任何额外的**控制台日志记录”。所以我更新了答案,以包含测试此LOGGING配置的简单方法。这可以让你知道这是来自你的项目(设置?)还是环境。 – jpic 2012-10-20 16:41:40

相关问题