繁体   English   中英

golang调用mysql函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM