PostgreSQL触发器异常文本的格式取决于系统?

时间:2014-10-30 19:47:08

标签: django postgresql

我在PostgreSQL的insert事件上写了一个触发器,它在某些情况下会引发异常。这是一段pg_plsql代码(引发异常):

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

输出看起来像'error | creator | 7.56111'。

但是在配置系统上:

  • Debian 7.7稳定
  • 包:postgresql-9.3
  • 版本:9.3.5-1.pgdg70 + 1

输出看起来像'ОШИБКА:error | creator | 7.56111'(系统区域设置是俄语)。

为什么会这样?

感谢。

1 个答案:

答案 0 :(得分:1)

PostgreSQL报告转换为数据库区域设置的错误。如果您不想要,可以在LC_MESSAGES时间(或可能CREATE DATABASE更改ALTER DATABASE,我还没有检查过。

但是,您不应该解析错误消息。使用扩展错误消息结构 - accessible via psycopg2.extensions.Diagnostics。使用其中一个RAISE表单,您可以指定DETAIL消息并将应用有效负载存储在其中,并使用自定义SQLSTATE向您的应用指示它是否为带有效负载的应用程序特定消息。

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