3.2 ORM框架
Beego中內(nèi)嵌了ORM框架,用來操作數(shù)據(jù)庫。那么ORM框架是什么呢?ORM框架是Object-RelationShip-Mapping的縮寫,中文叫對象關(guān)系映射.
3.2.1 ORM初始化
-
首先要導(dǎo)包
import "github.com/astaxie/beego/orm" -
然后要定義一個結(jié)構(gòu)體
type User struct{ Id int Name string PassWord string }思考:如果表名和字段名為小寫會發(fā)生什么結(jié)果?
注意觀察數(shù)據(jù)庫表中的字段和結(jié)構(gòu)體中的字段是否一樣?
-
然后向數(shù)據(jù)庫中注冊表,這一步又分為三步:
-
連接數(shù)據(jù)庫
用RegisterDataBase()函數(shù),第一個參數(shù)為數(shù)據(jù)庫別名,也可以理解為數(shù)據(jù)庫的key值,項目中必須有且只能有一個別名為
default的連接,第二個參數(shù)是數(shù)據(jù)庫驅(qū)動,這里我們用的是MySQL數(shù)據(jù)庫,所以以MySQL驅(qū)動為例,第三個參數(shù)是連接字符串,和傳統(tǒng)操作數(shù)據(jù)庫連接字符串一樣,格式為:用戶名:密碼@tcp(ip:port)/數(shù)據(jù)庫名稱?編碼方式,代碼如下:orm.RegisterDataBase("default","mysql","root:123456@tcp(127.0.0.1:3306)/class1?charset=utf8")注意:ORM只能操作表,不能操作數(shù)據(jù)庫,所以我們連接的數(shù)據(jù)庫要提前在MySQL終端創(chuàng)建好。
-
注冊數(shù)據(jù)庫表
用orm.RegisterModel()函數(shù),參數(shù)是結(jié)構(gòu)體對象,如果有多個表,可以用
,隔開,多new幾個對象:orm.RegisterModel(new(User)) -
生成表
用orm.RunSyncdb()函數(shù),這個函數(shù)有三個參數(shù),
第一個參數(shù)是數(shù)據(jù)庫的別名和連接數(shù)據(jù)庫的第一個參數(shù)相對應(yīng)。
第二個參數(shù)是是否強(qiáng)制更新,一般我們寫的都是false,如果寫true的話,每次項目編譯一次數(shù)據(jù)庫就會被清空一次,fasle的話會在數(shù)據(jù)庫發(fā)生重大改變(比如添加字段)的時候更新數(shù)據(jù)庫。
第三個參數(shù)是用來說,生成表過程是否可見,如果我們寫成課件,那么生成表的時候執(zhí)行的SQL語句就會在終端看到。反之看不見。代碼如下:
orm.RunSyncdb("default",false,true)
-
完整代碼如下:
import "github.com/astaxie/beego/orm"
type User struct {
Id int
Name string
Passwd string
}
func init(){
//1.連接數(shù)據(jù)庫
orm.RegisterDataBase("default","mysql","root:123456@tcp(127.0.0.1:3306)/test?charset=utf8")
//2.注冊表
orm.RegisterModel(new(User))
//3.生成表
//1.數(shù)據(jù)庫別名
//2.是否強(qiáng)制更新
//3.創(chuàng)建表過程是否可見
orm.RunSyncdb("default",false,true)
}
因為這里我們把ORM初始化的代碼放到了 models包的init()函數(shù)里面,所以如果我們想讓他執(zhí)行的話就需要在main.go里面加入這么一句代碼:
import _ "classOne/models"
3.2.2 簡單的ORM增刪改查操作
在執(zhí)行ORM的操作之前需要先把ORM包導(dǎo)入,但是GoLand會自動幫我們導(dǎo)包,也可以手動導(dǎo)包
import "github.com/astaxie/beego/orm"
插入
-
先獲取一個ORM對象,用orm.NewOrm()即可獲得
o := orm.NewOrm() -
定義一個要插入數(shù)據(jù)庫的結(jié)構(gòu)體對象
var user User -
給定義的對象賦值
user.Name = "zhangsan" user.Passwd = "123456"這里不用給Id賦值,因為建表的時候我們沒有指定主鍵,ORM默認(rèn)會以變量名為Id,類型為int的字段當(dāng)主鍵,至于如何指定主鍵,我們明天詳細(xì)介紹。
-
執(zhí)行插入操作,o.Insert()插入,參數(shù)是結(jié)構(gòu)體對象,返回值是插入的id和錯誤信息。
id, err := o.Insert(&user) if err == nil { fmt.Println(id) }
查詢
-
也是要先獲得一個ORM對象
o := orm.NewOrm() -
定義一個要獲取數(shù)據(jù)的結(jié)構(gòu)體對象
var user User -
給結(jié)構(gòu)體對象賦值,相當(dāng)于給查詢條件賦值
user.Name = "zhangsan" -
查詢,用o.Read(),第一個參數(shù)是對象地址,第二個參數(shù)是指定查詢字段,返回值只有錯誤信息。
err := o.Read(&user,"Name") if err != nil{ beego.Info("查詢數(shù)據(jù)錯誤",err) return }如果查詢字段是查詢對象的主鍵的話,可以不用指定查詢字段
更新
-
一樣的套路,先獲得ORM對象
o := orm.NewOrm() -
定義一個要更新的結(jié)構(gòu)體對象
var user User -
給結(jié)構(gòu)體對象賦值,相當(dāng)于給查詢條件賦值
user.Name = "zhangsan" -
查詢要更新的對象是否存在
err := o.Read(&user) if err != nil{ beego.Info("查詢數(shù)據(jù)錯誤",err) return } -
如果查找到了要更新的對象,就給這個對象賦新值
user.Passwd = "123456" -
執(zhí)行更新操作,用o.Update()函數(shù),參數(shù)是結(jié)構(gòu)體對象指針,返回值是更新的條目數(shù)和錯誤信息
count,err=o.Update(&user) if err != nil{ beego.Info("更新數(shù)據(jù)錯誤",err) return }
刪除
-
同樣的,獲取ORM對象,獲取要刪除的對象
o := orm.NewOrm() var user User -
給刪除對象賦值,刪除的對象主鍵必須有值,如果主鍵沒值,就查詢一下。我們這里直接給主鍵賦值。
user.Id = 1 -
執(zhí)行刪除操作,用的方法是o.Delete(),參數(shù)是刪除的結(jié)構(gòu)體對象,返回值是刪除的條目數(shù)和錯誤信息
num, err := o.Delete(&User{Id: 1}) if err == nil { fmt.Println(num) }