我知道使用自定义类型是一个常见问题,但请耐心等待...
我想定义一个自定义类型“connectioninfo”(见下文):
65床0761538a我想将 connectioninfo 限制为有限数量的类型之一,即:
65床0761539b我该怎么做?
到目前为止我的进展:
我定义了一个 connectioninfo 接口(我现在知道这在 gorm 中是无效的,但我如何解决它?)
65床076153a0然后我用两种类型实现了这个接口(并实现了扫描仪和评估器接口),如下所示:
65床076153a8但是我当然收到以下错误:
65床076153b0您可以通过这种方式来代替使用此联合 github 链接。您可以克隆这些存储库并运行代码。这是有效的。
package storage import ( "database/sql/driver" "encoding/json" "fmt" "log" "gorm.io/driver/sqlite" "gorm.io/gorm" "gorm.io/gorm/logger" ) type DataSourceType string const ( POSTGRES DataSourceType = "POSTGRES" MYSQL DataSourceType = "MYSQL" ) type PostgresConnectionInfo struct { Host string Port int Username string Password string DBName string } type MySQLConnectionInfo struct { Host string Port int Username string Password string DBName string } type ConnectionInfo struct { Postgres *PostgresConnectionInfo `gorm:"-" json:"postgres,omitempty"` Mysql *MySQLConnectionInfo `gorm:"-" json:"mysql,omitempty"` } type DataSource struct { gorm.Model Name string Type DataSourceType `sql:"type:ENUM('POSTGRES')" gorm:"column:data_source_type"` ConnectionInfo ConnectionInfo `gorm:"type:json" ` } func (a *ConnectionInfo) Scan(src any) error { switch src := src.(type) { case nil: return nil case []byte: var res ConnectionInfo err := json.Unmarshal(src, &res) *a = res return err default: return fmt.Errorf("scan: unable to scan type %T into struct", src) } } func (a ConnectionInfo) Value() (driver.Value, error) { ba, err := json.Marshal(a) return ba, err } func GormTest2() { db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{ Logger: logger.Default.LogMode(logger.Info), }) if err != nil { log.Fatal("could not open database") } err = db.AutoMigrate(&DataSource{}) if err != nil { log.Fatal("could not migrate database") } createTestData1(db) fetchData1(db) } func createTestData1(db *gorm.DB) { ds := []DataSource{ { Name: "Postgres", Type: POSTGRES, ConnectionInfo: ConnectionInfo{ Postgres: &PostgresConnectionInfo{ Host: "localhost", Port: 333, Username: "sdlfj", Password: "sdfs", DBName: "sdfsd", }, }, }, { Name: "Mysql", Type: MYSQL, ConnectionInfo: ConnectionInfo{ Mysql: &MySQLConnectionInfo{ Host: "localhost", Port: 333, Username: "sdlfj", Password: "sdfs", DBName: "sdfsd", }, }, }, } err := db.Create(&ds).Error if err != nil { log.Println("failed to create data") } } func fetchData1(db *gorm.DB) { var dsList []DataSource if err := db.Find(&dsList).Error; err != nil { log.Println("failed to load data") } log.Println(dsList) }