正在从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)
}