GORM 与 PostgreSQL 注释实现
在 PostgreSQL 中使用 GORM 时,为表和字段添加注释的方式与 MySQL 有所不同。下面我将展示一个完整的使用示例:
go
复制
下载
package main import ( "fmt" "log" "time" "gorm.io/driver/postgres" "gorm.io/gorm" ) // Product 产品模型 type Product struct { ID uint `gorm:"primaryKey;comment:产品唯一标识符"` Name string `gorm:"size:100;not null;comment:产品名称"` Price float64 `gorm:"comment:产品价格(美元)"` Description string `gorm:"type:text;comment:产品详细描述"` InStock bool `gorm:"default:true;comment:库存状态"` CreatedAt time.Time `gorm:"comment:创建时间"` UpdatedAt time.Time `gorm:"comment:最后更新时间"` } func main() { // 连接到 PostgreSQL 数据库 dsn := "host=localhost user=postgres password=postgres dbname=gorm_comments port=5432 sslmode=disable TimeZone=Asia/Shanghai" db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{}) if err != nil { log.Fatalf("数据库连接失败: %v", err) } fmt.Println("✅ 成功连接到 PostgreSQL 数据库") // 创建表并添加注释 if err := createTableWithComments(db, &Product{}, "产品信息表"); err != nil { log.Fatalf("创建表失败: %v", err) } fmt.Println("✅ 表创建完成,注释已添加") // 插入示例数据 products := []Product{ {Name: "Laptop", Price: 1299.99, Description: "高性能笔记本电脑", InStock: true}, {Name: "Smartphone", Price: 899.99, Description: "最新款智能手机", InStock: true}, {Name: "Tablet", Price: 599.99, Description: "便携式平板电脑", InStock: false}, } result := db.Create(&products) if result.Error != nil { log.Fatalf("插入数据失败: %v", result.Error) } fmt.Printf("✅ 成功插入 %d 条产品数据\n", len(products)) // 查询数据 var retrievedProducts []Product db.Find(&retrievedProducts) fmt.Println("\n📦 产品列表:") for _, p := range retrievedProducts { fmt.Printf("#%d: %s ($%.2f) - 库存状态: %t\n", p.ID, p.Name, p.Price, p.InStock) } // 查看表注释 showTableComments(db, "products") } // createTableWithComments 创建表并添加注释 func createTableWithComments(db *gorm.DB, model interface{}, tableComment string) error { // 创建表结构 if err := db.AutoMigrate(model); err != nil { return err } // 获取表名 stmt := &gorm.Statement{DB: db} stmt.Parse(model) tableName := stmt.Schema.Table // 添加表注释 if err := db.Exec(fmt.Sprintf(`COMMENT ON TABLE %s IS '%s'`, tableName, tableComment)).Error; err != nil { return fmt.Errorf("添加表注释失败: %w", err) } return nil } // showTableComments 显示表和字段的注释 func showTableComments(db *gorm.DB, tableName string) { fmt.Printf("\n📝 表 '%s' 的注释信息:\n", tableName) // 查询表注释 var tableComment string db.Raw(` SELECT obj_description('public.' || ?::regclass, 'pg_class') `, tableName).Scan(&tableComment) fmt.Printf("表注释: %s\n", tableComment) // 查询字段注释 type ColumnComment struct { ColumnName string Comment string } var columns []ColumnComment db.Raw(` SELECT a.attname AS column_name, pg_catalog.col_description(a.attrelid, a.attnum) AS comment FROM pg_catalog.pg_attribute a WHERE a.attrelid = 'public.' || ?::regclass AND a.attnum > 0 AND NOT a.attisdropped ORDER BY a.attnum; `, tableName).Scan(&columns) fmt.Println("\n字段注释:") for _, col := range columns { fmt.Printf("- %-15s: %s\n", col.ColumnName, col.Comment) } }
PostgreSQL 注释关键点
-
添加字段注释
go
复制
下载
type Product struct { ID uint `gorm:"primaryKey;comment:产品唯一标识符"` // ... }
GORM 在创建表时会自动为字段添加注释
-
添加表注释
go
复制
下载
// 添加表注释 db.Exec(`COMMENT ON TABLE products IS '产品信息表'`)
-
查询注释信息
sql
复制
下载
-- 表注释 SELECT obj_description('public.products'::regclass, 'pg_class'); -- 字段注释 SELECT a.attname AS column_name, pg_catalog.col_description(a.attrelid, a.attnum) AS comment FROM pg_catalog.pg_attribute a WHERE a.attrelid = 'public.products'::regclass;
注意事项
-
表注释需要单独添加:与 MySQL 不同,PostgreSQL 不能在 CREATE TABLE 语句中添加表注释
-
特殊字符处理:注释中的单引号需要转义
go
复制
下载
`comment:用户''名称` // 两个单引号表示一个单引号
-
表名大小写:PostgreSQL 默认小写表名,如果使用大写需加双引号
go
复制
下载
db.Exec(`COMMENT ON TABLE "UserTable" IS '注释'`)
-
GORM 版本:确保使用 GORM v1.20.0+ 以获得完整的注释支持
运行此代码后,您将在数据库中看到带有完整注释的产品表,并能通过查询验证注释是否已正确添加。