熟悉GO開發的朋友們應該都知道,在GO的web開發領域,gorm的使用非常廣泛,但是我使用很長時間後,終於下決心要把它換掉。
為什麼換掉Gorm
無法更新空值,比如數字0,空字串,布林值空。
當然這裡並不是說一定不行,只是不做特殊處理的情況下不行。比如你把strut轉成map,就可以了。或者直接使用map。
動態條件拼接太麻煩。
前端做篩選的時候,傳過來的引數有哪些不一定,數量有多少也不一定。這種情況下如果你的SQL語句是提前寫死的,那肯定是不能滿足需求的。另外如果引數一大堆,那麼寫佔位符?
的數量是不是寫正確了,也是個大問題。
寫sql也是一件麻煩事。
我們希望只輸入必要的引數,程式就能給我返回相應的資料。誰也不想天天去寫sql,又要注意語法,又要注意拼寫。
用Aorm來代替
花了將近2周的時間,我開發出了一個新的orm,姑且認為它是吧,算是解決了上面的問題。現在已經開源,文件也已經準備好,地址如下
https://github.com/tangpanqin...
基本特性如下
- 簡易並且快速
- 支援 MySQL 資料庫
- 支援空值查詢和寫入
- 支援自動遷移表結構
- 支援動態生成Sql
有興趣的朋友,可以移步上面的連結看詳情,如果能夠幫助到你,希望能給個星星。
下面,我們給出幾個例子。
利用Aorm實現空值寫入
假設我們現在已經定義了Person
結構
type Person struct {
Id aorm.Int `aorm:"primary;auto_increment" json:"id"`
Name aorm.String `aorm:"size:100;not null;comment:名字" json:"name"`
Sex aorm.Bool `aorm:"index;comment:性別" json:"sex"`
Age aorm.Int `aorm:"index;comment:年齡" json:"age"`
Type aorm.Int `aorm:"index;comment:型別" json:"type"`
CreateTime aorm.Time `aorm:"comment:建立時間" json:"createTime"`
Money aorm.Float `aorm:"comment:金額" json:"money"`
Test aorm.Float `aorm:"type:double;comment:測試" json:"test"`
}
你只需要執行如下程式碼,即可寫入資料庫
id, errInsert := aorm.Use(db).Debug(true).Insert(&Person{
Name: aorm.StringFrom("Alice"),
Sex: aorm.BoolFrom(false),
Age: aorm.IntFrom(18),
Type: aorm.IntFrom(0),
CreateTime: aorm.TimeFrom(time.Now()),
Money: aorm.FloatFrom(100.15987654321),
Test: aorm.FloatFrom(200.15987654321987654321),
})
if errInsert != nil {
fmt.Println(errInsert)
}
fmt.Println(id)
它實際執行的sql如下
INSERT INTO person (name,sex,age,type,create_time,money,test) VALUES (?,?,?,?,?,?,?)
Alice false 18 0 2022-12-07 10:10:26.1450773 +0800 CST m=+0.031808801 100.15987654321 200.15987654321987
注意哦,type對應的值是0,正確寫入, sex的值是false,也正確寫入
利用Aorm實現條件動態拼接
假設我們要從多個維度來查詢person,但是究竟多少個是未知的,可以使用下面的方法。
無論多少個查詢條件,直接往WhereArr
裡新增即可
var listByWhere []Person
var where1 []aorm.WhereItem
where1 = append(where1, aorm.WhereItem{Field: "type", Opt: aorm.Eq, Val: 0})
where1 = append(where1, aorm.WhereItem{Field: "age", Opt: aorm.In, Val: []int{18, 20}})
where1 = append(where1, aorm.WhereItem{Field: "money", Opt: aorm.Between, Val: []float64{100.1, 200.9}})
where1 = append(where1, aorm.WhereItem{Field: "money", Opt: aorm.Eq, Val: 100.15})
where1 = append(where1, aorm.WhereItem{Field: "name", Opt: aorm.Like, Val: []string{"%", "li", "%"}})
aorm.Use(db).Debug(true).Table("person").WhereArr(where1).GetMany(&listByWhere)
for i := 0; i < len(listByWhere); i++ {
fmt.Println(listByWhere[i])
}
它產生的sql如下
SELECT * FROM person WHERE type = ? AND age IN (?,?) AND money BETWEEN (?) AND (?) AND CONCAT(money,'') = ? AND name LIKE concat('%',?,'%')
0 18 20 100.1 200.9 100.15 li
究竟有多少個問號,他們都在哪裡,你根本不需要關心,也無需關心
更多體驗
怎麼樣,還可以吧? 如果有興趣,在你的go專案裡,使用如下命令,即刻體驗
go get -u github.com/tangpanqing/aorm
最後再發一次專案和文件地址
https://github.com/tangpanqin...
如果能夠幫助到你,記得給我點個星星哦。。。