【发布时间】:2017-05-09 07:54:21
【问题描述】:
目前,我对所有数据库查询(主要是 CRUD)使用 GO-GORM,但在将生成的 UUID 插入 MySQL 数据库列时遇到了一些问题。
该列是多个博客中建议的 BINARY(16),UUID 是使用 Golang 的 github.com/satori/go.uuid 包生成的。
如果用户上不存在 UUID,我正在使用 GORM 的 BeforeCreate 钩子生成 UUID,我使用的代码如下:
func (u *User) BeforeCreate(scope *gorm.Scope) (err error) {
if u.UserID == uuid.Nil {
uuid, err := uuid.NewV4().MarshalBinary()
scope.SetColumn("user_id", uuid)
}
}
我还使用 len 来获取 MarshalBinary 输出的长度,它返回为 16。
我在尝试将 UUID 插入 MySQL 时从 GORM 得到的错误如下:
(Error 1406: Data too long for column 'user_id' at row 1)
我也有 fmt.Println(uuid) 来查看结果,它们也如下(显然每次插入都会生成 UUID)
[93 132 59 55 102 96 72 35 137 185 34 21 195 88 213 127]
我的 MYSQL 架构也如下:
CREATE TABLE users
(
id INT(10) unsigned PRIMARY KEY NOT NULL AUTO_INCREMENT,
created_at TIMESTAMP,
updated_at TIMESTAMP,
deleted_at TIMESTAMP,
user_id BINARY(16) NOT NULL,
username VARCHAR(255) NOT NULL,
password VARCHAR(255),
firstname VARCHAR(255),
lastname VARCHAR(255),
email VARCHAR(255),
address_id VARCHAR(255)
);
CREATE INDEX idx_users_deleted_at ON users (deleted_at);
CREATE UNIQUE INDEX username ON users (username);
CREATE UNIQUE INDEX user_id ON users (user_id);
我尝试了不同的方法和库来生成 UUID 并将它们转换为二进制文件以插入类似的结果。
【问题讨论】:
-
可能是个愚蠢的问题,但你为什么要为
user_id使用二进制文件?你为什么要使用en.wikipedia.org/wiki/Universally_unique_identifier之类的东西? -
我可以在这里看到 stackoverflow.com/questions/15130321/… 这真的很容易生成。
-
我一直在使用它,但我最好的猜测是全部依赖于数据库。我可以看到你有
id,然后是user_id,为什么你还有user_id? -
Mysql 没有 uuid 字段。 Gorm 自己生成了 id 列。我想要一个 uuid 列,如果需要,我会考虑删除 gorm 生成的列...
-
我问过你,如果你的用户表中的主键是
id,为什么你还有user_id?你应该考虑将你的表重命名为user,因为它是一个模型。看看这里stackoverflow.com/questions/338156/…。以id为主,user_id在我看来是完全多余的。