Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何调试:内部错误当前事务被中止,在事务块结束之前忽略命令_Python_Django_Postgresql_Postgis_Geodjango - Fatal编程技术网

Python 如何调试:内部错误当前事务被中止,在事务块结束之前忽略命令

Python 如何调试:内部错误当前事务被中止,在事务块结束之前忽略命令,python,django,postgresql,postgis,geodjango,Python,Django,Postgresql,Postgis,Geodjango,大家好 我使用GeoDjango完成了我的第一步,我正在寻找更好的选项来检查错误的sql语句 到目前为止,我只是想在我的postgresql表中保存一个lng+lat点 该模型定义为: geolocation = models.PointField(_('Geo Location'), geography=True, null = True, blank = True,

大家好

我使用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只提供一般错误消息“内部错误”。


谢谢你的帮助和建议

在大多数情况下,这意味着前一条SQL语句无法执行。在这种情况下,您应该:

  • 启用SQL,请参阅要粘贴到settings.py中的以下代码段

  • 设置DEBUG=1,否则不会记录SQL

  • 再次运行runserver,您将在控制台中看到所有SQL查询

  • 直接在数据库中执行最后一个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
    提供任何其他控制台输出,请尝试:

  • 阅读并粘贴
    /tmp

  • 将目录更改为
    autocomplete\u light\u env/src/django autocomplete light/test\u project

  • 打开
    test\u project/settings.py
    ,将
    日志记录
    配置替换为上述配置

  • 运行服务器并打开浏览器

  • 您的控制台将如下所示:

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

    您建议的SQL日志记录配置没有为我提供任何额外的控制台日志记录。我有DEBUG=True,所以我不确定还要尝试什么来实际查看SQL。我的.extra()调用有一个错误,我的where有一个拼写错误。我花了几个小时才注意到。如果我能够看到我生成的SQL,那将是小菜一碟。我的问题得到了解决,但Django肯定没有帮助。我给你的答案加1,因为“在大多数情况下,这意味着前面的SQL语句无法执行。”这正是我的问题所在。堆栈跟踪显示一个无法保存的对象,但实际上是它上面的一个查询。根据我的经验,Django堆栈跟踪在大多数情况下都没有任何帮助。因此,我更新了答案,以包含一种测试此日志记录配置的简单方法。这允许您知道这是否来自您的项目(设置?)或环境。日志指令的重要部分(与默认Django安装相比)是设置
    'Django':{{…'level':'DEBUG'.}
    而不是
    记录器
    部分中的
    'INFO'