GORM模型字段:string和*string類型在數據庫中究竟有何區別?

GORM模型字段:string和*string類型在數據庫中究竟有何區別?

GORM模型字段:指針類型與非指針類型數據庫差異及應用示例

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

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

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

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

代碼示例:

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

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類型,即使未賦值,數據庫也會存儲空字符串     user1 := User{Name: "Alice"}     db.Create(&user1)      // *string類型,未賦值,數據庫存儲NULL     user2 := User{Name: "Bob"}     db.Create(&user2)      // *string類型,賦值,數據庫存儲指定值     email := "charlie@example.com"     user3 := User{Name: "Charlie", Email: &email}     db.Create(&user3)      var users []User     db.Find(&users)     fmt.Println(users) }

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

總結:

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

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