go語言GORM庫無法向postgresql數據庫插入數據的排查
本文探討使用Go語言和GORM庫操作PostgreSQL數據庫時遇到的一個問題:嘗試向menu表插入數據失敗,報錯“failed to encode args[3]: unable to encode 1 into text format for varchar (oid 1043): cannot find encode plan”。
數據庫表結構 (DDL)
數據庫表menu的定義如下:
CREATE TABLE "public"."menu" ( "id" int4 NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 MINVALUE 1 MAXVALUE 2147483647 START 1 ), "title" varchar(255) COLLATE "pg_catalog"."default", "router" varchar(255) COLLATE "pg_catalog"."default", "state" varchar(255) COLLATE "pg_catalog"."default", "sort" int4, "icon" varchar(255) COLLATE "pg_catalog"."default", "created_at" timestamp(6), "updated_at" timestamp(6), "sid" int4 NOT NULL DEFAULT 0 ); ALTER TABLE "public"."menu" OWNER TO "postgres"; COMMENT ON COLUMN "public"."menu"."title" IS '標題'; COMMENT ON COLUMN "public"."menu"."router" IS '路由'; COMMENT ON COLUMN "public"."menu"."state" IS '狀態'; COMMENT ON COLUMN "public"."menu"."sort" IS '排序'; COMMENT ON COLUMN "public"."menu"."icon" IS '圖標'; COMMENT ON TABLE "public"."menu" IS '菜單表';
數據庫連接配置
數據庫連接代碼如下:
dsn := "host=xxxx user=postgres password=xxxxx dbname=xxxx port=5432 sslmode=disable timezone=Asia/Shanghai" db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{}) if err != nil { // 處理錯誤 }
Go語言結構體定義
對應的Go語言結構體:
type MenuModel struct { ID int `gorm:"column:id"` Title String `gorm:"column:title"` Router string `gorm:"column:router"` Sid int `gorm:"column:sid"` State int `gorm:"column:state"` // 問題所在 Sort int `gorm:"column:sort"` Icon string `gorm:"column:icon"` CreatedAt time.Time `gorm:"column:created_at;autoCreateTime"` UpdatedAt time.Time `gorm:"column:updated_at;autoUpdateTime"` }
插入數據操作
插入數據的代碼:
initdb() // 初始化數據庫連接 menu := MenuModel{ Title: "1", Router: "1", Sid: 1, State: 1, // 問題所在 Sort: 1, Icon: "1", } db.Create(&menu) fmt.Println(menu.ID)
錯誤分析與解決方法
錯誤信息提示無法將整數1編碼為varchar類型。仔細對比數據庫表結構和Go語言結構體定義,發現問題在于MenuModel結構體的State字段類型為int,而數據庫表中的state列類型為varchar。 這導致GORM嘗試將整數直接插入到varchar列中,引發類型不匹配錯誤。
解決方法是將MenuModel結構體的State字段類型修改為string:
type MenuModel struct { ID int `gorm:"column:id"` Title string `gorm:"column:title"` Router string `gorm:"column:router"` Sid int `gorm:"column:sid"` State string `gorm:"column:state"` // 修改為string Sort int `gorm:"column:sort"` Icon string `gorm:"column:icon"` CreatedAt time.Time `gorm:"column:created_at;autoCreateTime"` UpdatedAt time.Time `gorm:"column:updated_at;autoUpdateTime"` }
修改后,GORM將正確地將字符串”1″插入到數據庫的state列中。 此外,GORM的標簽可以簡化,因為GORM會根據字段名自動推斷列名。
通過這個修改,應該可以解決數據插入問題。 記住處理gorm.Open函數可能返回的錯誤。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END