我试图使用gorm将一个 struct Named Teacher插入到SQLite数据库中,当我调用创建函数时,我收到一个错误:

INSERT INTO `teachers` (`name`,`department`,`password`) VALUES  RETURNING `id`
panic: unsupported data

这是我的老师 struct :

type Teacher struct {
    Id         int    `json:"id" db:"id" gorm:"primarykey"`
    Name       string `json:"name" db:"name"`
    Department string `json:"department" db:"department"`
    Password   string `json:"-" db:"password"`
}

这就是我插入的方式:

data := Teacher{
        Id:         0,
        Name:       "JohnDoe",
        Department: "ComputerScience",
        Password:   "12312312312321",
    }
DB.Create(&data)

编辑:

一些更多代码用于理解:

Main.go:

t := models.Teacher{
        Id:         0,
        Name:       "JohnDoe",
        Department: "ComputerScience",
        Password:   "12312312312321",
    }
    t.CreateTeacher()

teacher.go:

type Teacher struct {
    Id         int    `json:"id" db:"id" gorm:"primarykey"`
    Name       string `json:"name" db:"name"`
    Department string `json:"department" db:"department"`
    Password   string `json:"-" db:"password"`
}

func (teacher Teacher) CreateTeacher() error {
    fmt.Println(teacher)
    err := database.Insert(teacher)
    if err != nil {
        panic(err)
    }
    return nil
}

数据库.Go:

func ConnectDatabase() error {
    var err error
    DB, err = gorm.Open(sqlite.Open("./cisl-database.db"), &gorm.Config{})
    if err != nil {
        return err
    }
    return nil
}
func Insert(data interface{}) error {
    fmt.Print(data)
    err := ConnectDatabase()
    if err != nil {
        return err
    }

    DB.AutoMigrate(&data)
    
    if err := DB.Create(&data).Error; err != nil {
        return err
    }
    return nil
}

推荐答案

// ...
func Insert(data interface{}) error {
// ...

因为你将接口{}类型传递给gorm,它无法处理它.你需要更改为

func Insert(data Teacher) error {

顺便说一句,imo,我认为该代码不是最佳实践:)

也许您可以考虑将DB实例调用到Create(&data)或其他操作,例如Transaction等.

Go相关问答推荐

如何创建两个连接的io.ReadWriteClosers以用于测试目的

GO错误:Tim.Time未实现driver.Valuer(缺少方法值)

GORM:一个表的两个外键

通过代理从golang连接到ftp

使用 Golang 获取目录磁盘使用情况

使用 OpenTelemetry 统一不同服务的范围

如何使用 sync.WaitGroup 来执行所有的 goroutine?

将 firestoreinteger_value转换为整数

如何使用 go 包设置标头键和值:shurcooL/graphql 或 hasura/go-graphql-client?

设置 graphql 的最大文件上传大小(golang)

AddE 上的 Apache Tinkerpop gremlin-go 驱动程序 Next() 返回E0903:没有剩余结果

枚举的 Golang 验证器自定义验证规则

grpc-gateway:重定向与定义不匹配(原始文件)

此代码如何生成内存对齐切片?

无法访问 Go 模块导入的远程存储库

如何获取多个 url 参数值

当 git clone 工作时,Go mod tidy 在私有存储库上失败

如何从字符串中删除多个换行符`\n`但只保留一个?

为什么在 goroutine 中声明时,benbjohnson/clock 模拟计时器不执行?

golangci-lint 的 GitHub 操作失败,无法加载 fmt