Использование GORM для получения имен таблиц из Postgresql - PullRequest
0 голосов
/ 01 апреля 2020

Ищет имена таблиц из моей базы данных postgresql. Теперь я знаю, что в Go вы можете использовать sql и драйвер pq, но я использую GORM для выполнения запросов в моем REST API.

Тип table_name в PostgreSQL - это "information_schema". sql_identifier». Это то, что я пытался сделать, но тип не строка.

var tables []string
if err := db.Table("information_schema.tables").Select("table_name").Where("table_schema = ?", "public").Find(&tables).Error; err != nil {
    panic(err)
}

1 Ответ

0 голосов
/ 03 апреля 2020

TL; DR

Чтобы выбрать значения одного столбца в срез, используя Gorm, вы можете использовать db.Pluck helper:

var tables []string
if err := db.Table("information_schema.tables").Where("table_schema = ?", "public").Pluck("table_name", &tables).Error; err != nil {
    panic(err)
}

TS; WM

С учетом этого оператор SELECT возвращает набор строк с одним или несколькими столбцами. Чтобы отобразить их в Go коде, нам нужна некая структура, чтобы Горм мог понять, какой столбец сопоставлен с каким полем структуры. Даже если вы выбираете только один столбец, это просто структура с одним полем.

type Table struct {
    TableName   string
    // more fields if needed...
}

Таким образом, ваша выходная переменная должна быть []*Table:

var tables []*Table
if err := db.Table("information_schema.tables").Select("table_name").Where("table_schema = ?", "public").Find(&tables).Error; err != nil {
    panic(err)
}

Примечание: это может быть также []Table, если вы не хотите изменять элемент внутри среза.

Если вы не хотите определять структуру, вы можете использовать функцию db.Pluck, которая является просто помощник такого рода кода:

rows, err := db.Table("information_schema.tables").Select("table_name").Where("table_schema = ?", "public").Rows()
defer rows.Close()

var tables []string
var name string
for rows.Next() {
    row.Scan(&name)
    tables = append(tables, name)
}

...