2016-06-01 2 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

Спасибо, это было полезно, однако я просто собираюсь использовать то, что упоминал выше (ссылка DROP DATABASE IF EXISTS dbName;). Если кому-то интересно, что сообщение об ошибке было возвращено, это было: pq.Error {Severity: "ERROR", Code: "3D000", Сообщение: "database \" dbname \ "не существует", Detail: "", Hint: "", Position: "", InternalPosition: "", InternalQuery: "", Where: "", Schema: "", Table: "", Column: "", DataTypeName: "", " Ограничение: "", Файл: "dbcommands.c", Строка: "799", Обычная: "dropdb"} Невозможно выполнить настройку: pq: база данных "dbname" не существует – b0xxed1n

Смежные вопросы