gpt4 book ai didi

mysql - golang调用mysql函数

转载 作者:IT王子 更新时间:2023-10-29 01:39:44 27 4
gpt4 key购买 nike

我有一个现有的 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 实现数据库模型并且我在如何告诉 gorm 和数据库/sql 在创建新的 User 实例时调用 UUID_SHORT() 方面一片空白。

来自模型/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"
}

来自模型/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 调用中调用 MySQL 的 UUID_SHORT(),您似乎需要对在某个时刻到达 testutil.DB.Create(&user) 行之前的数据库。

找到一种方法将 gorm 用于 MySQL UUID_SHORT() 调用本身可能会很好,但这可能最终需要更多的工作来映射单个行值(在本例中为 user_uuid)用于您的 model.User (可能需要一个额外的 struct 只是为了 UUID_SHORT())

因此,使用更简单的方法可能会有所帮助。以下代码是如何使用 sql package 找到 UUID_SHORT() 的基本(尽管可能很差*)示例(特别是 get_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 可能已经提供了处理此问题的方法)。

关于mysql - golang调用mysql函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27694020/

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