beego框架學習(三) -orm的使用


目前beego-orm支持的數據有: 
- MySQL:https://github.com/go-sql-driver/mysql 
- PostgreSQL:https://github.com/lib/pq 
- Sqlite3:https://github.com/mattn/go-sqlite 
beego-orm的相關特性 
- 支持 Go 的所有類型存儲 
- 輕松上手,采用簡單的 CRUD 風格 
- 自動 Join 關聯表 
- 跨數據庫兼容查詢 
- 允許直接使用 SQL 查詢/映射 
- 嚴格完整的測試保證 ORM 的穩定與健壯 

  


orm的使用
- 導入orm的依賴:go get github.com/astaxie/beego/orm.
- 使用的步驟:
1.往orm注冊默認數據庫(包括數據庫的連接的一些設置參數),往orm注冊model。

def.go
/**
*實體定義
*/
type User struct {
Id int `json:"id" pk:"auto" orm:"column(id)"`
Username string `json:"username" orm:"column(username)"`
Password string `json:"password" orm:"column(password)"`
Sex string `json:"sex" orm:"column(sex)"`
Tel string `json:"tel" orm:"column(tel)"`
}
/**
*數據相關配置
*/
type DBConfig struct {
Host string
Port string
Database string
Username string
Password string
MaxIdleConns int //最大空閑連接
MaxOpenConns int //最大連接數
}

  

usermanger.go
package service
import (
"github.com/astaxie/beego/orm"
"fmt"
log "github.com/Sirupsen/logrus"
_ "github.com/go-sql-driver/mysql"
)
/**
*CreatedBy:Hanyajun
*Time:2017 2017/10/28 14:34
*Project:Go_study
*Discription:使用orm操作mysql
*/
type UserManager struct {
DBConf *DBConfig
}
/*
* usermanger構造器 
*/ 
func NewUserManager(dbConf *DBConfig) *UserManager {
mgr := &UserManager{
DBConf: dbConf,
}
mgr.initDB()//初始化orm
return mgr
}
/**
初始化db,注冊默認數據庫,同時將實體模型也注冊上去
*/
func (mgr *UserManager) initDB() {
orm.RegisterDriver("mysql", orm.DRMySQL)
   ds :=fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?        charset=utf8", mgr.DBConf.Username, mgr.DBConf.Password, mgr.DBConf.Host, mgr.DBConf.Port, mgr.DBConf.Database)
log.Infof("datasource=[%s]", ds)
  err := orm.RegisterDataBase("default", "mysql", ds,   mgr.DBConf.MaxIdleConns, mgr.DBConf.MaxOpenConns)
if err != nil {
panic(err)
}
orm.RegisterModel(new(User))
}

  

注意可以使用以下方式進行切換數據庫:

orm.RegisterDataBase("db1", "mysql", "root:root@/orm_db2?charset=utf8")
orm.RegisterDataBase("db2", "sqlite3", "data.db")
o1 := orm.NewOrm()
o1.Using("db1")
o2 := orm.NewOrm()
o2.Using("db2")

  

2.操作數據庫

對於要操作的數據庫如果你知道它的主鍵,則你可以用orm對象的crud方法進行數據庫的相關操作。

/**
*通過orm對象來進行數據庫的操作,這種情況是必須要知道主鍵
*/
func (mgr *UserManager) OpreateUserWithOrmObjct(id int) () {
orm.Debug = true
o := orm.NewOrm()
var users = new(User)//注意使用new來創建變量,否則就會報錯
users.Id = id
fmt.Print("******開始讀取數據庫*******")
o.Read(users)
fmt.Print(users)
fmt.Print("******開始更新數據庫*******")
users.Username = "123"
o.Update(users)
o.Read(users)
fmt.Printf("更新后的數據庫為%v", users)
o.Delete(users) 
}

  

如果你不知道主鍵則可以通過orm的Querytable或者Raw執行原始的sql語句來操作數據庫。

/**
根據某些字段來read 1:采用queryTable方法來查詢 2:采用Raw執行sql語句
*/
func (mgr *UserManager) GetUsersByIdWithQueryTable(id string) (*[]User, error) {
orm.Debug = true
o := orm.NewOrm()
user := new([]User)
_, err := o.QueryTable("user").Filter("Id", id).All(user)
//err := o.QueryTable("user").Filter("id",key).One(user)
//err:=o.Raw("select * from user where Id = ?",id).QueryRow(user)//使用sql語句進行查詢
if err != nil {
fmt.Println(err)
return nil, err
}
return user, nil
}

  

3. 分頁查詢,可以使用limt方法來進行分頁(注意limt后面的參數,第一個表示的是分頁大小,第二個是指的偏移量,如同sql的offset)。

/**
* 分頁結構體 
*/ 
type Page struct {
PageNo int
PageSize int
TotalPage int
TotalCount int
FirstPage bool
LastPage bool
List interface{}
}
func PageUtil(count int, pageNo int, pageSize int, list interface{}) Page {
tp := count / pageSize
if count % pageSize > 0 {
tp = count / pageSize + 1
}
return Page{ 
PageNo: pageNo, 
PageSize: pageSize, 
TotalPage: tp, 
TotalCount: count,
FirstPage: pageNo == 1,
LastPage: pageNo == tp,
List: list
}
} 
func (mgr *UserManager) getUsrsWithPage(ps int, pageSize int) (page Page ) {
o := orm.NewOrm()
user:=new([]User)
o.QueryTable("user").Limit(pageSize,(ps-1)*pageSize).All(user)
TotalCount,_:=o.QueryTable("user").Count()
page.TotalCount=int(TotalCount)
page.PageSize=pageSize
page.List=user
fmt.Println(user)
return page
}

  

除了以上方法操作數據庫, QueryBuilder 提供了一個簡便,流暢的 SQL 查詢構造器。在不影響代碼可讀性的前提下用來快速的建立 SQL 語句,QueryBuilder 在功能上與 ORM 重合, 但是各有利弊。ORM 更適用於簡單的 CRUD 操作,而 QueryBuilder 則更適用於復雜的查詢,例如查詢中包含子查詢和多重聯結。使用方法如下:

// User 包裝了下面的查詢結果
type User struct {
Name string
Age int
}
var users []User
// 獲取 QueryBuilder 對象. 需要指定數據庫驅動參數。
// 第二個返回值是錯誤對象,在這里略過
qb, _ := orm.NewQueryBuilder("mysql")
// 構建查詢對象
qb.Select("user.name",
"profile.age").
From("user").
InnerJoin("profile").On("user.id_user = profile.fk_user").
Where("age > ?").
OrderBy("name").Desc().
Limit(10).Offset(0)
// 導出 SQL 語句
sql := qb.String()
// 執行 SQL 語句
o := orm.NewOrm()
o.Raw(sql, 20).QueryRows(&users)

當然數據庫操作必然離不開事物,orm支持簡單的orm事物操作:
o := NewOrm()
err := o.Begin()
// 事務處理過程
...
...
// 此過程中的所有使用 o Ormer 對象的查詢都在事務處理范圍內
if SomeError {
err = o.Rollback()
} else {
err = o.Commit()
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM