封裝 實戰gorm

2021-10-05 23:18:53 字數 4535 閱讀 3123

gorm以物件導向的編碼方式對資料庫讀寫操作進行了封裝,將每乙個資料實體當作乙個結構體(類)進行處理。本片文章從實際開發中所遇問題和新的需求,對gorm進行一次封裝,以此加快開發速度。

首先介紹**架構:

|-----------------------

|- component

|-- db.go

|-- model.go

|-- test.go

|- include

|-- container.go

|-- db.go

|- init

|-- init.go

|- model

|-- bean

|--- messageregister.go

|-- messageregister.go

|- test

|-- messageregister.go

|- main.go

|-----------------------

a. 入口檔案: main.go

package main

import _ "./init"

import "./test"

func main()

b. 編寫基礎結構體和介面(component)

(1)  資料庫連線相關, db.go

type swymodel struct(2)  資料實體相關, model.go 

}func (s *dpmodel) translate(out inte***ce{}, v inte***ce{}) (inte***ce{}, error)(3)  測試相關, test.go

package component

type dptest struct

c. 系統初始化,init.go

package init

import (

_ "../include"

)

d. 依賴包載入(include)

(1)初始化容器

//容器, 用於管理中介軟體

package include

import (

"fmt"

"sync"

)type container struct

}var cont *container = &container,

make(map[string]inte***ce{}, 8),

}func (c *container) register(n string, sl inte***ce{})

}func (c *container) get(n string) (inte***ce{}, error)

return sl, nil

}

(2)初始化資料庫連線例項

//依賴配置項

dsn := fmt.sprintf(

"%s:%s@(%s:%s)/%s?%s",

dc.user,

dc.password,

dc.host,

dc.port,

dc.dbname,

dc.option,

)db, err := gorm.open("mysql", dsn)

if err != nil

cont.register("db", db)

}func getdb(db inte***ce{}) *gorm.db

gd := db.(*gorm.db)

return gd

}e. 編寫資料實體(model)

(1) 編寫資料實體(bean)

package bean

import (

"../../component"

)type messageregister struct

func (s *messageregister) translateself(v inte***ce{}) *messageregister

var err error

var ok bool

var message *messageregister

if m, err = s.translate(s, v); err != nil

if message, ok = m.(*messageregister); !ok

return message

}

(2) 編寫實體操作物件

package model

import (

"fmt"

"../component"

"../include"

)type messageregistermodel struct

func newmessageregister() *messageregistermodel

gd := include.getdb(db)

if gd == nil

tablename := "go_register"

return &messageregistermodel,

}}

f. 編寫測試用例, messageregister.go

//----------------------- 建立一條記錄

messageregister.type = 1

messageregister.desc = `dora hope`

if err := modelmessageregister.create(messageregister).error; err != nil

fmt.println(`資料庫寫測試成功`)

//----------------------- 檢視一條記錄

//id := 1

//if err := modelmessageregister.where(`id = ?`, id).first(messageregister).error; err != nil

// panic(fmt.sprintf("資料庫讀測試失敗, err:`%v`\n", err))

//}"message is `%v`\n", messageregister)

//----------------------- json轉移處理(並沒有對記錄的生成等時間進行轉移)

//_ = modelmessageregister

//j := map[string]inte***ce{}

//if messageregister.translate(messageregister, j); messageregister == nil

"資料庫實體轉移成功, message:`%v`\n", messageregister)

}func tmessageregister()

t.test()

}以上就是本篇文章的所介紹的內容,從測試例項中可以看出,對gorm.db進行了簡單的封裝後,資料庫表名並沒有依賴的具體的資料實體,而是通過gorm.db.table方法進行設定,這樣做的目的是為了讓**邏輯更直觀,依賴關係表現更明顯。雖然只是對gorm簡單的封裝,但是還是挺好用的。實際編寫資料實體時,只需要實現資料實體結構和資料實體的操作物件就能很快對一張表的資料進行讀寫操作了。

gorm使用和例項封裝

三 gorm資料庫連線例項封裝 建立 db.create product 讀取 var product product db.first product,1 查詢id為1的product db.first product,code l1212 查詢code為l1212的product 更新 更新pr...

gorm快速使用

模型 為表中的字段,記得欄位名開頭大寫 type patient struct 此例為postgresql func main 不重新建立複數結尾的表,還是原來的表,可以利用原表中的結構,資料 db.singulartable true defer db.close 建立 patient db.cr...

GORM 開發例項

用 hql 的方式,這種方式好處是可以新增 distinct transactional readonly true compiledynamic collection listvlogofallsubspecials int offset 0,int max 10 用 criteria 的方式,這...