2016-06-01 13 views
2

私が実行してpostgresのドライバ(LIB/PQ)を使用してデータベースを削除しようとしている:Golang postgresエラー定数?

db.Exec("DROP DATABASE dbName;")

をしかし、私はエラーを受信したかどうかに基づいて異なる条件をしたいと思いますが何かありますまたはデータベースが存在しないというエラーです。

私の質問は、 "データベースは存在しません"というエラーメッセージが返されるかどうかを確認するために使用できる定数変数などですか、エラー文字列を手動で解析する必要がありますか?

私はドキュメントを見ようとしましたが、「データベースが存在しません」というものが見つかりませんでした。しかし、私はこのリストを見つけました:https://www.postgresql.org/docs/9.3/static/errcodes-appendix.html

多分それは他のエラーコードの下で合っていますか?また、Postgresドライバを使ってエラーコードを取得して比較する意味的に正しい方法はわかりません。私はこの?:

if err.ErrorCode != "xxx"

はありがとうのような何かを行う必要があります推測します。

+0

データベースを削除しようとする前にデータベースが存在するかどうかチェックしたくない理由は何ですか? – Nicarus

+0

それは受け入れ可能な解決策でもありますが、私はそれを行うことができないことを認識していませんでした:-)その質問はありますか?確かに – b0xxed1n

+0

。 pg_databaseオブジェクトをチェックしてください。 'SELECT TRUE AS result from pg_database WHERE datname = 'abc';' – Nicarus

答えて

4

lib/pqパッケージは、構造体であるタイプ*pq.Errorのエラーを返すことがあります。そうであれば、すべてのフィールドを使用してエラーの詳細を調べることができます。

これはそれを行うことができる方法です。

if err, ok := err.(*pq.Error); ok { 
    // Here err is of type *pq.Error, you may inspect all its fields, e.g.: 
    fmt.Println("pq error:", err.Code.Name()) 
} 

pq.Errorは、次のフィールドがあります。

type Error struct { 
    Severity   string 
    Code    ErrorCode 
    Message   string 
    Detail   string 
    Hint    string 
    Position   string 
    InternalPosition string 
    InternalQuery string 
    Where   string 
    Schema   string 
    Table   string 
    Column   string 
    DataTypeName  string 
    Constraint  string 
    File    string 
    Line    string 
    Routine   string 
} 

意味と、これらのフィールドの可能な値は、特定のPostresであり、完全なリストを見つけることができますここでは:Error and Notice Message Fields

+0

ありがとう、これは役に立ちましたが、私はちょうど上記のNicarus(DROP DATABASE IF EXISTS dbName;)を使用します。 エラーメッセージが何を返すのか不明な人は、 pq.Error {重大度: "ERROR"、コード: "3D000"、メッセージ: "database \" dbname \ "は存在しません"、データ型名: ""、内部型: ""、内部型: ""、スキーマ: ""、テーブル: ""、列: ""制約: ""、ファイル: "dbcommands.c"、行: "799"、ルーチン: "dropdb"} セットアップを実行できません:pq:database "dbname"は存在しません – b0xxed1n