2014-10-30 49 views
0

我为PostgreSQL的插入事件写了一个触发器,在某些情况下会引发异常。这是一块pg_plsql代码(其提高除外):PostgreSQL触发器异常文本的格式取决于系统?

IF user_rating.user_id = NEW.user1_id THEN 
    CASE error_id 
    WHEN 0 THEN creator_allow_flag := True; 
    WHEN 1,2 THEN RAISE EXCEPTION 'error|creator|%', available_limit; 
    END CASE; 
ELSIF user_rating.user_id = NEW.user2_id THEN 
    CASE error_id 
    WHEN 0 THEN partner_allow_flag := True; 
    WHEN 1,2 THEN RAISE EXCEPTION 'error|partner|%', available_limit; 
    END CASE; 
ELSE 
    RAISE EXCEPTION '%', user_rating.user_id; 
END IF; 

Django应用程序根据用户的动作产生INSERT SQL命令,该命令导致我pl_pgsql触发和捕捉型InternalError该(从django.db)的异常,如果触发引发异常。异常文本作为Django Exception对象的属性传递给我的django应用程序。

它工作正常,但在不同的系统上有不同的异常文本,从PostgreSQL返回。

在系统配置:

  • 的Ubuntu 14.04.1 LTS
  • 包装:在PostgreSQL 9.3
  • 版本:9.3.5-0ubuntu0.14.04.1

输出样子'错误|创作者| 7.56111'。

但与配置系统:

  • 的Debian 7.7稳定
  • 包装:在PostgreSQL-9.3
  • 版本:9.3.5-1.pgdg70 + 1

输出的样子'ОШИБКА:error | creator | 7.56111'(系统区域设置是俄语)。

为什么会发生这种情况?

谢谢。

回答

1

PostgreSQL报告转换为数据库区域设置的错误。如果你不希望你可以改变LC_MESSAGESCREATE DATABASE时间(或可能与ALTER DATABASE,我没有检查)。

但是,您不应该解析错误消息。使用扩展的错误消息结构 - accessible via psycopg2.extensions.Diagnostics。使用RAISE表单之一,该表单允许您指定DETAIL消息并将应用负载存储在那里,并使用自定义SQLSTATE向您的应用程序指示它是具有有效负载的应用程序特定消息。

PostgreSQL可能(并且在过去)更改错误消息格式。不要依赖于能够解析它们。

+0

非常感谢您的好建议。后人:在Django的情况下 - psycopg2异常对象位于__cause__属性的django.db异常对象(在我的情况下 - django.db.InternalError .__ cause__)。 – user2414728 2014-11-01 13:17:36