为了账号安全,请及时绑定邮箱和手机立即绑定

使用 GORM 从 Postgresql 中检索表名

使用 GORM 从 Postgresql 中检索表名

Go
青春有我 2022-05-23 17:18:58
希望从我的 postgresql 数据库中检索表名。现在,我知道在 Go 中你可以使用 sql 和 pq 驱动程序,但我使用 GORM 在我的 REST API 中进行查询。PostgreSQL 中的 table_name 类型是“information_schema.sql_identifier”。这是我试图做的,但类型不是字符串。var tables []stringif err := db.Table("information_schema.tables").Select("table_name").Where("table_schema = ?", "public").Find(&tables).Error; err != nil {    panic(err)}
查看完整描述

1 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

要使用 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 可以了解哪个列映射到结构的哪个字段。即使您只选择 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)

}


查看完整回答
反对 回复 2022-05-23
  • 1 回答
  • 0 关注
  • 343 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信