為什么使用 GORM 無法將數據插入到 PostgreSQL 數據庫中的菜單表?

為什么使用 GORM 無法將數據插入到 PostgreSQL 數據庫中的菜單表?

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
喜歡就支持一下吧
點贊10 分享