【问题标题】:Error when trying to create tables from model尝试从模型创建表时出错
【发布时间】:2016-02-27 20:13:23
【问题描述】:

我今天开始玩 gorm,但不幸的是遇到了一些愚蠢的错误,并且卡住了一段时间。 起初我在 Windows 上运行 MySQL 5 (5.0.51b) 和最新版本的 go。我确实去获取了 gorm 和 mysql 驱动程序,它编译时没有错误并且能够连接(可能),但是每当我尝试根据声明的类型创建表时,它都会抛出一个不提供信息的错误(因为错误是由 MySQL 抛出)。这是我的代码:

mport (
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "github.com/jinzhu/gorm"
)

type User struct {
    id int
}

func main() {
    db, err := gorm.Open("mysql", "root:vertrigo@/shop?charset=utf8&parseTime=True&loc=Local")
    fmt.Println(err)

    a := db.Set("gorm:table_options", "ENGINE=InnoDB").CreateTable(&User{})

    fmt.Println(a)
}

因此该模型旨在非常基础,例如一列的表。现在是输出:

&{0x111e2230 错误 1064:您的 SQL 语法有错误; 检查与您的 MySQL 服务器版本相对应的手册 在第 1 行的 ') ENGINE=InnoDB' 附近使用正确的语法 0 0x112d4060 0x112d4000 0x112d8140 0 {0x112a3f20} 假 地图[gorm:table_options:ENGINE=InnoDB] 地图[]}

第一个是连接错误,这意味着它能够连接,但是查询不是那么好,并且除了 gorm 生成的 SQL 由于某种原因失败之外,该错误几乎没有说明。 所以问题是是否有人知道为什么会抛出错误以及是否有任何解决方案。

【问题讨论】:

    标签: mysql go go-gorm


    【解决方案1】:

    尝试创建空表时出现该错误,例如:

    create table User() ENGINE=InnoDB
    

    gorm 生成空表语句,因为 User 结构的 id 字段是私有的。

    id int 更改为ID intCapitalising struct 字段的第一个字母将其暴露给外部包。


    作为次要问题,不仅仅是打印错误:

    db, err := gorm.Open(...
    fmt.Println(err)
    

    检查每个潜在错误并立即处理它们是个好主意:

    db, err := gorm.Open(...
    if err != nil {
        log.Fatal(err)
    }
    

    对于其他错误,gorm's error handling 与大多数 go 代码相比有点不寻常。您可能希望经常使用db.GetErrors() 检查错误。

    【讨论】:

    • 非常感谢您的回答!我不知道 go 中的那个大写字母。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    相关资源
    最近更新 更多