[英]golang calling mysql function
我有一个现有的mysql表,该表使用mysql的UUID_SHORT()函数生成唯一的ID。 该表的简化版本:
CREATE TABLE `users` (
`user_uuid` bigint(20) unsigned NOT NULL,
`user_name` varchar(64) NOT NULL
);
并通过以下方式创建一个新用户:
INSERT INTO users (user_uuid, user_name) values (UUID_SHORT(), "new user name");
我开始使用gorm实现数据库模型,并且在创建新的User实例时如何告诉gorm和数据库/ sql调用UUID_SHORT()上存在空白。
从model / users.go:
package model
type User struct {
UserUUID uint64 `gorm:"column:user_uuid;primary_key:yes";sql:"notnull;default:uuid_short"`
UserName string `sql:"notnull"`
}
func (user User) TableName() string {
return "users"
}
从model / users_test.go:
package model_test
import (
"testing"
".../model"
".../model/testutil"
)
func TestUserCreate(t *testing.T) {
user := model.User{
// UserUUID: **HOW DO I CALL UUID_SHORT() HERE?**,
UserName: "Go Test",
}
// testutil.DB is the successful result of gorm.Open("mysql", ...)
testutil.DB.Create(&user)
}
保存实例后,如何为user_uuid列调用UUID_SHORT()?
为了在model.User
UUID_SHORT()
调用中调用MySQL的UUID_SHORT()
,似乎需要在到达testutil.DB.Create(&user)
行之前对数据库进行附加的SQL调用。 。
这可能是不错的找到一种方法,使用gorm
为MySQL UUID_SHORT()
调用自身,但最终可能需要更多的工作只是为了图个单列值( user_uuid
用在这种情况下)在model.User
(可能仅需要用于UUID_SHORT()
的附加struct
。
因此,使用更简单的方法可能会有所帮助。 以下代码是使用sql
包 (在这种情况下,尤其是使用get_uuid_short()
用户定义的函数get_uuid_short()
如何UUID_SHORT()
的基本示例(尽管可能很差* ):
package model_test
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
"github.com/jinzhu/gorm"
"github.com/stretchr/testify/assert"
"log"
"testing"
)
type User struct {
UserUUID uint64 `gorm:"column:user_uuid;primary_key:yes";sql:"notnull;default:uuid_short"`
UserName string `sql:"notnull"`
}
func (user User) TableName() string {
return "users"
}
func get_uuid_short() uint64 {
var uuid_short uint64
/* connect to db using `sql` package */
db, err := sql.Open("mysql", "username:password@tcp(127.0.0.1:3306)/uuid_test")
if err != nil {
log.Fatal(err)
}
/* select UUID_SHORT() */
rows, err := db.Query("select UUID_SHORT()")
if err != nil {
log.Fatal(err)
}
defer db.Close()
/* get value of uuid_short */
for rows.Next() {
err := rows.Scan(&uuid_short)
if err != nil {
log.Fatal(err)
}
}
return uuid_short
}
func TestUserCreate(t *testing.T) {
user := User{
UserUUID: get_uuid_short(), /* get next UUID_SHORT() value */
UserName: "Go Test",
}
db, err := gorm.Open("mysql", "username:password@/uuid_test?charset=utf8&parseTime=True&loc=Local")
db.Create(&user)
assert.Nil(t, err)
}
在MySQL表中显示如下结果:
mysql> select * from users;
+-------------------+-----------+
| user_uuid | user_name |
+-------------------+-----------+
| 24070794506141712 | Go Test |
| 24070794506141713 | Go Test |
| 24070794506141714 | Go Test |
+-------------------+-----------+
3 rows in set (0.00 sec)
*注意:此代码可能无法解决多个用户同时调用get_uuid_short()
(尽管MySQL可能已经提供了一种处理此问题的方法)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.