使用 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)
}
希望从我的 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)
}