Gorm AutoMigrate()和CreateTable()无法正常工作

时间:2018-07-23 05:20:05

标签: go schema migrate go-gorm

我已经在这里以及整个Google上解决了相关问题。

我正在将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 ] 

仅供参考,不推荐使用downvote-这是一个合理的问题,因为我在文档摘要页面上使用了gorm示例,并且基本上只是更改了结构。而且该结构使用了正确的基本类型(将其切回到原始文章代码中的切片除外),并且该错误不是很有帮助。我看到在空白表名称错误之前有一个SYNTAX错误-但是为什么呢?我为GORM提供了有效的结构吗?

1 个答案:

答案 0 :(得分:1)

我很确定sqlite没有您的AuthIP([]字符串)的类型。我不确定GORM是否允许您编写自定义的Valuer和Scanner接口方法,该方法将允许您将字符串转换为数组然后再返回还是不返回,但这是您可能要签出的内容。

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

如果实现tabler接口,还可以更好地控制表的名称。

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

type tabler interface {
    TableName() string
}