我正在嘗試將 UUID_SHORT() 生成為 ID。我沒有使用觸發器,而是先獲取 UUID_SHORT(),然后將其作為 ID 插入。但是,我對如何創建 GetUUID() 函式作為助手感到困惑。
正如我下面的代碼,它總是在生成 UUID_SHORT() 之前建立新的連接,這意味著會有很多連接只是為了生成 UUID_SHORT()
如何在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
}
uj5u.com熱心網友回復:
全域變數怎么樣?
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 個連接上打開空閑連接和垃圾郵件請求是否好。
uj5u.com熱心網友回復:
您正在利用資料庫為您生成 UUID,只要您讓資料庫執行此操作,您就需要一個連接來發送查詢。
您通常有兩種選擇:
- 讓資料庫在插入資料時動態生成 UUID
- 在發送之前在您自己的代碼中生成 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 的字串表示形式,或者您可以uint64輕松地將其從uint32.
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/422096.html
標籤:
上一篇:通道和等待組進入死鎖
