栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

一对一的Golang Gorm

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

一对一的Golang Gorm

如本期所述,gorm并非设计为使用联接来预加载其他结构值。如果您想继续使用gorm并能够使用联接加载值,则必须使用gorm中公开的SQL
Builder
,并编写一些代码来扫描所需的值。

如果必须考虑许多表,这将变得很麻烦。如果可以选择使用xorm,则它们支持加载结构值。在此处找到要点下方描述。

注意:我并没有扫描所有字段,仅能说明问题。

范例

package mainimport (    "log"    "github.com/jinzhu/gorm"    _ "github.com/jinzhu/gorm/dialects/sqlite"    "github.com/kylelemons/godebug/pretty")// Ordertype Order struct {    gorm.Model    Status     string    OrderItems []OrderItem}// Order line itemtype OrderItem struct {    gorm.Model    OrderID  uint    ItemID   uint    Item     Item    Quantity int}// Producttype Item struct {    gorm.Model    ItemName string    Amount   float32}var (    items = []Item{        {ItemName: "Go Mug", Amount: 12.49},        {ItemName: "Go Keychain", Amount: 6.95},        {ItemName: "Go Tshirt", Amount: 17.99},    })func main() {    db, err := gorm.Open("sqlite3", "/tmp/gorm.db")    db.LogMode(true)    if err != nil {        log.Panic(err)    }    defer db.Close()    // Migrate the schema    db.AutoMigrate(&OrderItem{}, &Order{}, &Item{})    // Create Items    for index := range items {        db.Create(&items[index])    }    order := Order{Status: "pending"}    db.Create(&order)    item1 := OrderItem{OrderID: order.ID, ItemID: items[0].ID, Quantity: 1}    item2 := OrderItem{OrderID: order.ID, ItemID: items[1].ID, Quantity: 4}    db.Create(&item1)    db.Create(&item2)    // Query with joins    rows, err := db.Table("orders").Where("orders.id = ? and status = ?", order.ID, "pending").        Joins("Join order_items on order_items.order_id = orders.id").        Joins("Join items on items.id = order_items.id").        Select("orders.id, orders.status, order_items.order_id, order_items.item_id, order_items.quantity" + ", items.item_name, items.amount").Rows()    if err != nil {        log.Panic(err)    }    defer rows.Close()    // Values to load into    newOrder := &Order{}    newOrder.OrderItems = make([]OrderItem, 0)    for rows.Next() {        orderItem := OrderItem{}        item := Item{}        err = rows.Scan(&newOrder.ID, &newOrder.Status, &orderItem.OrderID, &orderItem.ItemID, &orderItem.Quantity, &item.ItemName, &item.Amount)        if err != nil { log.Panic(err)        }        orderItem.Item = item        newOrder.OrderItems = append(newOrder.OrderItems, orderItem)    }    log.Print(pretty.Sprint(newOrder))}

输出

/tmp/main.go.go:55) [2018-06-18 18:33:59]  [0.74ms]  INSERT INTO "items" ("created_at","updated_at","deleted_at","item_name","amount") VALUES ('2018-06-18 18:33:59','2018-06-18 18:33:59',NULL,'Go Mug','12.49')  [1 rows affected or returned ](/tmp/main.go.go:55) [2018-06-18 18:33:59]  [0.50ms]  INSERT INTO "items" ("created_at","updated_at","deleted_at","item_name","amount") VALUES ('2018-06-18 18:33:59','2018-06-18 18:33:59',NULL,'Go Keychain','6.95')  [1 rows affected or returned ](/tmp/main.go.go:55) [2018-06-18 18:33:59]  [0.65ms]  INSERT INTO "items" ("created_at","updated_at","deleted_at","item_name","amount") VALUES ('2018-06-18 18:33:59','2018-06-18 18:33:59',NULL,'Go Tshirt','17.99')  [1 rows affected or returned ](/tmp/main.go.go:58) [2018-06-18 18:33:59]  [0.71ms]  INSERT INTO "orders" ("created_at","updated_at","deleted_at","status") VALUES ('2018-06-18 18:33:59','2018-06-18 18:33:59',NULL,'pending')  [1 rows affected or returned ](/tmp/main.go.go:61) [2018-06-18 18:33:59]  [0.62ms]  INSERT INTO "order_items" ("created_at","updated_at","deleted_at","order_id","item_id","quantity") VALUES ('2018-06-18 18:33:59','2018-06-18 18:33:59',NULL,'49','145','1')  [1 rows affected or returned ](/tmp/main.go.go:62) [2018-06-18 18:33:59]  [0.45ms]  INSERT INTO "order_items" ("created_at","updated_at","deleted_at","order_id","item_id","quantity") VALUES ('2018-06-18 18:33:59','2018-06-18 18:33:59',NULL,'49','146','4')  [1 rows affected or returned ](/tmp/main.go.go:69) [2018-06-18 18:33:59]  [0.23ms]  SELECT orders.id, orders.status, order_items.order_id, order_items.item_id, order_items.quantity, items.item_name, items.amount FROM "orders" Join order_items on order_items.order_id = orders.id Join items on items.id = order_items.id WHERe (orders.id = '49' and status = 'pending')  [0 rows affected or returned ] --- onLY ONE QUERY WAS USED TO FILL THE STRUCT BELOW2018/06/18 18:33:59 {Model:      {ID:        49,   CreatedAt: 0001-01-01 00:00:00 +0000 UTC,   UpdatedAt: 0001-01-01 00:00:00 +0000 UTC,   DeletedAt: nil}, Status:     "pending", OrderItems: [{Model:    {ID:        0,    CreatedAt: 0001-01-01 00:00:00 +0000 UTC,    UpdatedAt: 0001-01-01 00:00:00 +0000 UTC,    DeletedAt: nil},    OrderID:  49,    ItemID:   145,    Item:     {Model:    {ID:        0,    CreatedAt: 0001-01-01 00:00:00 +0000 UTC,    UpdatedAt: 0001-01-01 00:00:00 +0000 UTC,    DeletedAt: nil},    ItemName: "Go Mug",    Amount:   12.489999771118164},    Quantity: 1},   {Model:    {ID:        0,    CreatedAt: 0001-01-01 00:00:00 +0000 UTC,    UpdatedAt: 0001-01-01 00:00:00 +0000 UTC,    DeletedAt: nil},    OrderID:  49,    ItemID:   146,    Item:     {Model:    {ID:        0,    CreatedAt: 0001-01-01 00:00:00 +0000 UTC,    UpdatedAt: 0001-01-01 00:00:00 +0000 UTC,    DeletedAt: nil},    ItemName: "Go Keychain",    Amount:   6.949999809265137},    Quantity: 4}]}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/452359.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号