go-xorm使用方法

  1. 創(chuàng)建Orm引擎
    xorm支持同時存在多個orm引擎绩脆,一個引擎一般對應(yīng)一個數(shù)據(jù)庫,調(diào)用xorm.NewEngine(driverName, dataSourceName)方法創(chuàng)建引擎姑躲,示例如下:
package model

import (
    _ "github.com/go-sql-driver/mysql"
    "github.com/go-xorm/xorm"
    "github.com/micro/go-micro/util/log"
)

var engine *xorm.Engine

func init() {
    en, err := xorm.NewEngine("mysql", "root:123@/test?charset=utf8")
    if err != nil {
        log.Error("connect to database error")
        panic(err)
    }
    log.Info("connect success")
    engine = en
}

一般情況下配乱,如果只操作一個數(shù)據(jù)庫則創(chuàng)建一個engine即可排抬,engine是GoRoutine安全的两踏。engine創(chuàng)建完成后并沒有立即連接數(shù)據(jù)庫逞怨,此時可以通過engine.Ping()來進(jìn)行數(shù)據(jù)庫的連接測試庶喜。

  1. 連接參數(shù)設(shè)置
    en.ShowSQL(true)
    en.SetMaxIdleConns(maxIdleConn)
    en.SetMaxOpenConns(maxOpenConn)

如果需要顯示生成的SQL語句涩哟,可以通過engine.ShowSQL()來實現(xiàn)赡麦。
如果需要設(shè)置連接池的空閑數(shù)大小,可以使用engine.SetMaxIdleConns()來實現(xiàn)娩怎。
如果需要設(shè)置最大打開連接數(shù)搔课,則可以使用engine.SetMaxOpenConns()來實現(xiàn)。

  1. 名稱映射規(guī)則
    xorm由core.IMapper接口的實現(xiàn)者來管理映射規(guī)則截亦,內(nèi)置的三種IMapper實現(xiàn)為:core.SnakeMapper(默認(rèn))爬泥, core.SameMapper和core.GonicMapper。
    如果需要改變時魁巩,在engine創(chuàng)建完成后使用
en.SetMapper(core.SameMapper{})

如果你使用了別的命名規(guī)則映射方案,也可以自己實現(xiàn)一個IMapper姐浮。
表名稱和字段名稱的映射規(guī)則默認(rèn)是相同的谷遂,當(dāng)然也可以設(shè)置為不同,如:

en.SetTableMapper(core.SameMapper{})
en.SetColumnMapper(core.SnakeMapper{})

如果表名和字段名與映射規(guī)則不匹配時可以通過如下方法進(jìn)行修改:
如果表名與映射規(guī)則不一致卖鲤,則可以修改結(jié)構(gòu)體肾扰,如果結(jié)構(gòu)體中包含TableName() string方法,那么此方法的返回值就是對應(yīng)的數(shù)據(jù)庫表名稱蛋逾;也可以在操作數(shù)據(jù)庫時使用engine.Table()指定操作的數(shù)據(jù)庫表集晚。例如:

package model

import (
    "github.com/micro/go-micro/util/log"
)

type (
    User struct {
        Id int64 `xorm:"id"`
        Name string `xorm:"name"`
        Age int64 `xorm:"age"`
    }
)

func (User) TableName() string {
    //方法一:指定數(shù)據(jù)庫表名稱為users
    return "users"
}

func GetUserByName(name string) User {
    user := User{}
    //方法二:指定操作的表名稱為users
    has, err := engine.Table("users").Where("name=?", name).Get(&user)
    if err != nil {
        log.Error("select user error:", err)
    }
    log.Info("res :", has)
    return user
}

如果字段名稱與映射規(guī)則不同,則可以在定義結(jié)構(gòu)體時通過xorm:"'column_name'"進(jìn)行指定区匣。(使用單引號防止名稱沖突)
映射規(guī)則優(yōu)先級為engin.Table()>TableName() string>IMapper

  1. 字段屬性定義
    我們在field對應(yīng)的Tag中對Column的一些屬性進(jìn)行定義偷拔,定義的方法基本和我們寫SQL定義表結(jié)構(gòu)類似,比如:
type User struct {
    Id   int64
    Name string  `xorm:"varchar(25) notnull unique 'usr_name'"`
}

注意:Tag中的關(guān)鍵字均不區(qū)分大小寫亏钩,但字段名根據(jù)不同的數(shù)據(jù)庫是區(qū)分大小寫莲绰。詳細(xì)規(guī)則參考:Go語言中文網(wǎng):https://books.studygolang.com/xorm/chapter-02/4.columns.html

  1. 表結(jié)構(gòu)操作
    通常在項目啟動后我們需要對數(shù)據(jù)庫進(jìn)行同步,我們可以使用Sync或者Sync2(推薦)方法進(jìn)行同步操作姑丑,使用方法為:
    err := en.Sync2(new(User))
    if err != nil {
        log.Error("sync table error : ", err)
        panic(err)
    }

Sync2對Sync進(jìn)行了改進(jìn)蛤签,目前推薦使用Sync2。Sync2函數(shù)將進(jìn)行如下的同步操作:

自動檢測和創(chuàng)建表栅哀,這個檢測是根據(jù)表的名字
自動檢測和新增表中的字段震肮,這個檢測是根據(jù)字段名,同時對表中多余的字段給出警告信息
自動檢測留拾,創(chuàng)建和刪除索引和唯一索引戳晌,這個檢測是根據(jù)索引的一個或多個字段名,而不根據(jù)索引名稱痴柔。因此這里需要注意躬厌,如果在一個有大量數(shù)據(jù)的表中引入新的索引,數(shù)據(jù)庫可能需要一定的時間來建立索引。
自動轉(zhuǎn)換varchar字段類型到text字段類型扛施,自動警告其它字段類型在模型和數(shù)據(jù)庫之間不一致的情況鸿捧。
自動警告字段的默認(rèn)值,是否為空信息在模型和數(shù)據(jù)庫之間不匹配的情況
以上這些警告信息需要將engine.ShowWarn 設(shè)置為 true 才會顯示疙渣。
其他操作見:Go中文文檔:https://books.studygolang.com/xorm/chapter-03/

  1. 數(shù)據(jù)操作
    插入:
var user User
engine.Insert(&user)

查詢和統(tǒng)計主要使用Get, Find, Count, Rows, Iterate這幾個方法

//設(shè)置表別名
engine.Alias("o").Where("o.name = ?", name).Get(&order)
//And和Where函數(shù)中的條件基本相同匙奴,作為條件
engine.Where(...).And(...).Get(&order)
//指定字段名正序排序Asc,逆序Desc
engine.Asc("id").Find(&orders)

//傳入一個主鍵字段的值,作為查詢條件妄荔,如SELECT * FROM user Where id = 1
var user User
engine.Id(1).Get(&user)
//復(fù)合主鍵SELECT * FROM user Where id =1 AND name= 'name'
engine.Id(core.PK{1, "name"}).Get(&user)
//in
engine.In("cloumn", 1, 2, 3).Find()
engine.In("column", []int{1, 2, 3}).Find()

//指定部分查詢字段
engine.Select("a.*, (select name from b limit 1) as name").Find(&beans)
engine.Select("a.*, (select name from b limit 1) as name").Get(&bean)

//指定SQL語句
engine.Sql("select * from table").Find(&beans)

//指定字段
// SELECT age, name FROM user limit 1
engine.Cols("age", "name").Get(&usr)
// SELECT age, name FROM user
engine.Cols("age", "name").Find(&users)

更新:

user := new(User)
user.Name = "myname"
affected, err := engine.Id(id).Update(user)
// UPDATE user SET age=? AND name=?
engine.Cols("age", "name").Update(&user)

刪除:

user := new(User)
affected, err := engine.Id(id).Delete(user)

詳細(xì)文檔見Go語言中文網(wǎng):https://books.studygolang.com/xorm/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泼菌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子啦租,更是在濱河造成了極大的恐慌哗伯,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件篷角,死亡現(xiàn)場離奇詭異焊刹,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)恳蹲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進(jìn)店門虐块,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嘉蕾,你說我怎么就攤上這事贺奠。” “怎么了错忱?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵儡率,是天一觀的道長。 經(jīng)常有香客問我以清,道長喉悴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任玖媚,我火速辦了婚禮箕肃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘今魔。我一直安慰自己勺像,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布错森。 她就那樣靜靜地躺著吟宦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涩维。 梳的紋絲不亂的頭發(fā)上殃姓,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天袁波,我揣著相機(jī)與錄音,去河邊找鬼蜗侈。 笑死篷牌,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的踏幻。 我是一名探鬼主播枷颊,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼该面!你這毒婦竟也來了夭苗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤隔缀,失蹤者是張志新(化名)和其女友劉穎题造,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體猾瘸,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡界赔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了须妻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仔蝌。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡泛领,死狀恐怖荒吏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情渊鞋,我是刑警寧澤绰更,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站锡宋,受9級特大地震影響儡湾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜执俩,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一徐钠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧役首,春花似錦尝丐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至矮固,卻和暖如春失息,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工盹兢, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留邻梆,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓蛤迎,卻偏偏與公主長得像确虱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子替裆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,630評論 2 359