使用 GORM 从 Postgresql 中检索表名

Using GORM to retrieve tables names from Postgresql

希望从我的 postgresql 数据库中检索 table 姓名。现在,我知道在 Go 中你可以使用 sql 和 pq 驱动程序,但我在我的 REST API.

中使用 GORM 进行查询

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

要select使用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 语句 returns 一组具有一个或多个列的行。为了将它们映射到 Go 代码,我们需要一种结构,以便 Gorm 可以理解哪个列映射到结构的哪个字段。即使您只有 select 1 个单列,它也只是一个具有 1 个字段的结构。

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