gpt4 book ai didi

Gorm AutoMigrate() 和 CreateTable() 不工作

转载 作者:IT王子 更新时间:2023-10-29 02:09:32 34 4
gpt4 key购买 nike

我已经在此处和谷歌上遍历了相关问题。

我将 Gorm 与 SQLite3 结合使用。

每当我尝试在我的结构上运行任一函数时,我都会收到错误消息。当我调试并单步执行时,我看到表名是“”。 Gorm 没有得到我的结构名称,即 models.UserAuth。如果我调用 DropTable(models.UserAuth{}) 来显示没有名为 user_auth 的表(但至少它找出了表名)。当我浏览数据库时,当然没有表。

我的结构是

type UserAuth struct {
gorm.Model
ProfileID int `gorm:"not null" json:"profile_id"`
Username string `gorm:"size:20;unique_index" json:"username"`
Email string `gorm:"type:varchar(100);unique_index" json:"email"`
Password string `gorm:"not null" json:"password"`
Remember bool `gorm:"not null" json:"remeber"`
TwoFA bool `gorm:"not null" json:"twofa"`
Access int `gorm:"not null" json:"access"`
State int `gorm:"not null" json:"state"`
LastSeen string `gorm:"not null" json:"lastseen"``
}

我的 COMMON 迁移函数是:

func (d *Database) Migrate(m interface{}) {
logEntry := fmt.Sprintf("Auto Migrating %s...", reflect.TypeOf(m))

//d.db.DropTable(&models.UserAuth{})
//d.db.CreateTable(&models.UserAuth{})

// Do it the hard way
//if d.db.HasTable(&m) == false {
// Create table for model `User`
// d.db.CreateTable(&m)
// d.logThis.Info(fmt.Sprintf("%s %s with error %s", logEntry, "Failed", d.db.Error))
//}

// Migrate the schema
db := d.db.AutoMigrate(&m) //<--- Line 84
if db != nil && db.Error != nil {
//We have an error
d.logThis.Fatal(fmt.Sprintf("%s %s with error %s", logEntry, "Failed", db.Error))
}
d.logThis.Info(fmt.Sprintf("%s %s", logEntry, "Success"))
}

最后是它的调用方式:

app.Db.Migrate(models.UserAuth{})

开启调试的实际输出:

({PathToProject}/database/database.go:84) 
[2018-07-23 06:12:24] near ")": syntax error

({PathToProject}/database/database.go:84)
[2018-07-23 06:12:24] [0.99ms] CREATE TABLE "" ( )
[0 rows affected or returned ]

仅供引用,反对票是不必要的——这是一个合理的问题,因为我在文档摘要页面上采用了 gorm 示例,基本上只是更改了结构。并且该结构使用了正确的基本类型(除了将其返回到原始帖子的代码中的 slice 之外)并且错误不是很有帮助。我看到在空白表名错误之前有一个 SYNTAX 错误 - 但为什么呢?我给 GORM 一个有效的结构了吗?

最佳答案

我很确定 sqlite 没有您的 AuthIPs ([]string) 的类型。我不确定 GORM 是否允许您编写自定义 Valuer 和 Scanner 接口(interface)方法,这些方法允许您将字符串转换为数组并再次转换回来,但您可能想要检查一下。

更新:将 db := d.db.AutoMigrate(&m) 更改为 db := d.db.AutoMigrate(m) 以允许反射获取类型名称。

如果你实现了tabler接口(interface)你也可以更好的控制表名。

https://github.com/jinzhu/gorm/blob/master/scope.go#L305

type tabler interface {
TableName() string
}

关于Gorm AutoMigrate() 和 CreateTable() 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51471973/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com