使用GORM从Postgresql中检索表名



正在从postgresql数据库中检索表名。现在,我知道在Go中您可以使用sql和pq驱动程序,但我使用GORM在我的REST API中进行查询。

PostgreSQL中的table_name类型是"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)
}

TL;DR

要使用Gorm在切片中选择单列值,可以使用db.Pluck助手:

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代码,我们需要一种结构,以便Gorm能够理解哪一列映射到结构的哪个字段。即使只选择一个单列,它也只是一个包含一个字段的结构。

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)
}

最新更新