当前位置: 首页 > 面试题库 >

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

柴霖
2023-03-14
问题内容

我使用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语句无法执行。在这种情况下,您应该:

  1. 启用S​​QL 日志记录,请参见以下代码段以粘贴到settings.py中

  2. 设置DEBUG = 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的示例test_project

  1. 阅读并粘贴安装命令到 /tmp

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

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

  4. 运行服务器并打开浏览器

您的控制台将如下所示:

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


 类似资料:
  • 我在服务器中看到以下(截断的)stacktrace。JBoss 7.1.1最终版日志文件: 检查Postgres日志文件会显示以下语句: 我使用的是JBoss 7.1.1 Final附带的Infinispan,即5.1.2。最终的 这就是我认为正在发生的事情: Infinispan尝试运行选择计数(*) 语句,以查看中是否有任何记录 这个错误意味着什么,以及如何解决它?

  • 问题内容: 消息有很多错误: 从python-psycopg更改为python-psycopg2作为Django项目的数据库引擎。 代码保持不变,只是不知道这些错误来自何处。 问题答案: 当查询产生错误并且你尝试运行另一个查询而不先回滚事务时,这就是postgres所做的。(你可能会认为这是一项安全功能,可以防止数据被破坏。) 要解决此问题,你将要弄清楚错误查询在代码中的哪个位置执行。在你的Pos

  • 在我们的一个项目中,我们遇到了一个问题,Spring忽略了事务注释,然后失败了,出现了以下错误。 启动ApplicationContext时出错。要显示条件报告,请在启用“调试”的情况下重新运行应用程序。2018-09-13 15:05:18406错误[主]组织。springframework。靴子SpringApplication应用程序运行失败组织。springframework。道。Inva

  • 问题内容: 我需要从存储过程中写入日志表。现在,此日志信息必须能够在回滚过程中幸免。 我知道以前曾问过这个问题,但是我的情况有所不同,在这些问题中找不到我的问题的答案。 当存储过程中没有错误时,事情就很简单了,日志表中的条目就在那里。 当有错误时,事情就变得复杂了。 在该过程中,我可以在catch中进行回滚,然后将数据插入日志表,我知道并且我已经在这样做了。 但是问题是当存储过程这样调用时: 我知

  • 问题内容: 最近,在一个用于mysql数据库的PHP脚本中,我需要在恰好位于另一个事务内部的某个位置使用事务。我所有的测试似乎都表明这很好,但是我找不到有关此用法的任何文档。 我想确定-交易中的交易在mysql中是否有效?如果是这样,是否有办法找出嵌套事务中的层数?(即恢复到正常状态需要多少回滚) 预先感谢,Brian 问题答案: 手册的本页可能使您感兴趣: 12.3.3。 导致隐性提交的陈述 ;

  • 当我尝试在不使用事务的情况下更新Neo4JClient中的现有节点时,它对id和Name属性具有唯一约束,我收到以下异常: 节点6已经存在的标签用户和属性"Name"=[Mike] 但当我尝试更新事务中的节点时,会收到以下异常: 执行请求时收到意外的HTTP状态。 响应状态为:404未找到 Neo4j的响应(可能包括有用的细节!)was:{“结果”:[],“错误”:[{“代码”:“Neo.Clie