Golang - 如何在不创建新连接的情况下创建辅助程序 mysql 以生成 uuid / uuid_short?这是代码



我正在尝试将UUID_SHORT((生成为ID。我没有使用触发器,而是先获取UUID_SHORT((,然后作为ID插入。但是,我对如何创建GetUUID((函数作为助手感到困惑。

正如我下面的代码所示,它总是在生成UUID_SHORT((之前建立新的连接,这意味着只有生成UUIDSHORT((才会有这么多连接

如何在不创建新连接的情况下创建func GetUUID()

这是代码:

package database
import (
"database/sql"
"fmt"
"log"
"os"
"time"
_ "github.com/go-sql-driver/mysql"
)
type conncetion struct {
sqlDB *sql.DB
}
func NewMysqlConnection(databaseConnection *sql.DB) *conncetion {
return &conncetion{databaseConnection}
}
func SetupMysqlDatabaseConnection() (db *sql.DB) {
var (
driver   = os.Getenv("DB_DRIVERNAME")
username = os.Getenv("DB_USERNAME")
password = os.Getenv("DB_PASSWORD")
host     = os.Getenv("DB_HOST")
port     = os.Getenv("DB_PORT")
name     = os.Getenv("DB_NAME")
)
connection := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?parseTime=true", username, password, host, port, name)
db, err := sql.Open(driver, connection)
if err != nil {
log.Fatal(err)
}
db.SetMaxOpenConns(100)
db.SetMaxIdleConns(100)
db.SetConnMaxLifetime(100 * time.Millisecond)
return
}
func (c *conncetion) GenerateUUID() (uuid uint64, err error) {
uuid = 0
queryGetUUID := c.sqlDB.QueryRow(`SELECT UUID_SHORT()`)
err = queryGetUUID.Scan(
&uuid,
)
return
}
func GetUUID() (uuid uint64, err error) {
mysql := SetupMysqlDatabaseConnection()
db := NewMysqlConnection(mysql)
uuid, err = db.GenerateUUID()
return
}

您正在利用数据库为您生成UUID,只要您让数据库执行此操作,您就需要一个连接来发送查询。

这里通常有两个选项:

  1. 让DB在插入数据时动态生成UUID
  2. 在发送之前在您自己的代码中生成UUID

插入时生成ID

这意味着你需要改变你的操作方式,你插入数据的命令需要看起来像这样:

INSERT INTO your_table(id, value)
VALUES (
UUID_SHORT(), 
-- other values
);

这将在插入过程中自动为您生成ID,而无需之前生成。

如果您需要在执行插入后知道ID,您可以选择一些选项,例如使用LAST_INSERT_ID()或查询刚刚创建的数据。

有关更多信息,请参阅其他问题。

在代码中生成ID

你可以使用github.com/google/uuid.这样的软件包

import "github.com/google/uuid"
func GenerateUUID() (uint32, error) {
id, err := uuid.NewRandom()
if err != nil {
return 0, err
}
return id.ID(), nil
}

请注意,您还可以获得UUID的字符串表示,或者可以从uint32轻松地将其强制转换为uint64

全局变量怎么样?

package database
import (
"database/sql"
"fmt"
"log"
"os"
"time"
_ "github.com/go-sql-driver/mysql"
)
type conncetion struct {
sqlDB *sql.DB
}
var globalConnection *conncetion
func GetDB() *conncetion {
return globalConnection
}
func NewMysqlConnection(databaseConnection *sql.DB) *conncetion {
return &conncetion{databaseConnection}
}
func SetupMysqlDatabaseConnection() (db *sql.DB) {
var (
driver   = os.Getenv("DB_DRIVERNAME")
username = os.Getenv("DB_USERNAME")
password = os.Getenv("DB_PASSWORD")
host     = os.Getenv("DB_HOST")
port     = os.Getenv("DB_PORT")
name     = os.Getenv("DB_NAME")
)
connection := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?parseTime=true", username, password, host, port, name)
db, err := sql.Open(driver, connection)
if err != nil {
log.Fatal(err)
}
db.SetMaxOpenConns(100)
db.SetMaxIdleConns(100)
db.SetConnMaxLifetime(100 * time.Millisecond)
return
}
func (c *conncetion) GenerateUUID() (uuid uint64, err error) {
uuid = 0
queryGetUUID := c.sqlDB.QueryRow(`SELECT UUID_SHORT()`)
err = queryGetUUID.Scan(
&uuid,
)
return
}
func GetUUID() (uuid uint64, err error) {
// mysql := SetupMysqlDatabaseConnection()
// db := NewMysqlConnection(mysql)
db = GetDB()
uuid, err = db.GenerateUUID()
return
}
// can be written on main.go / server.go
func init() {
globalConnection = NewMysqlConnection(database.SetupMysqlDatabaseConnection())
}

但我不知道在1个连接上打开空闲连接和垃圾邮件请求是好是坏。

最新更新