GORM模型字段:string和*string類型在數(shù)據(jù)庫中究竟有何區(qū)別?

GORM模型字段:string和*string類型在數(shù)據(jù)庫中究竟有何區(qū)別?

GORM模型字段:指針類型與非指針類型數(shù)據(jù)庫差異及應(yīng)用示例

在使用GORM構(gòu)建模型時,字段聲明為指針類型(例如*String)還是非指針類型(例如string)會直接影響數(shù)據(jù)庫行為和Go代碼邏輯。本文將詳細(xì)分析GORM模型中string和*string的區(qū)別,并通過示例代碼進(jìn)行說明。

假設(shè)我們的User模型包含email字段(*string類型)和name字段(string類型):

string類型字段: 聲明為string類型的字段在數(shù)據(jù)庫中始終會存儲一個值,即使在創(chuàng)建User實例時未賦值,數(shù)據(jù)庫也會存儲一個空字符串(””)。這意味著該字段是必填的,雖然允許為空字符串,但它必須存在。

*`string類型字段:** 聲明為*string類型的字段在數(shù)據(jù)庫中允許存儲NULL值。如果User實例的email字段未賦值,數(shù)據(jù)庫中對應(yīng)的email列將存儲NULL`。這意味著該字段是可選的,可以為空。

代碼示例:

以下代碼片段展示了string和*string在實際應(yīng)用中的差異:

package main  import (     "fmt"     "gorm.io/driver/sqlite"     "gorm.io/gorm"     "time" )  type User struct {     ID        uint     Name      string     Email     *string     CreatedAt time.Time }  func main() {     db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})     if err != nil {         panic("failed to connect database")     }     db.AutoMigrate(&User{})      // string類型,即使未賦值,數(shù)據(jù)庫也會存儲空字符串     user1 := User{Name: "Alice"}     db.Create(&user1)      // *string類型,未賦值,數(shù)據(jù)庫存儲NULL     user2 := User{Name: "Bob"}     db.Create(&user2)      // *string類型,賦值,數(shù)據(jù)庫存儲指定值     email := "charlie@example.com"     user3 := User{Name: "Charlie", Email: &email}     db.Create(&user3)      var users []User     db.Find(&users)     fmt.Println(users) }

運(yùn)行此代碼,你會發(fā)現(xiàn):user1的email字段存儲空字符串;user2的email字段存儲NULL;user3的email字段存儲”charlie@example.com”。 這清楚地說明了指針類型允許數(shù)據(jù)庫字段為空,而非指針類型則不允許。

總結(jié):

選擇指針類型還是非指針類型取決于字段是否允許為空。如果字段必須存在(即使是空字符串),則使用非指針類型;如果字段允許為空(數(shù)據(jù)庫中可以為NULL),則使用指針類型。GORM會根據(jù)字段類型自動處理數(shù)據(jù)庫中的NULL值。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊5 分享