2014-10-30 39 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