向Gorm大聲說拜拜,Aorm你值得擁有

湯哥搞開發發表於2022-12-15

熟悉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...

如果能夠幫助到你,記得給我點個星星哦。。。

相關文章