golang利用beego框架orm操做mysql

GO引入orm框架操做mysql

在beego框架中引入orm操做mysql須要進行的步驟:javascript

第一步:導入orm框架依賴,導入mysql數據庫的驅動依賴java

import (
	"github.com/astaxie/beego/orm"     //導入orm框架
	_ "github.com/go-sql-driver/mysql" //導入數據庫驅動
)

第二步:進行模型結構定義mysql

//例如定義user表模型結構
type TestUser struct {
    Id   int `orm:"pk;auto;column(user_id)"` //表示設置爲主鍵而且自增,列名爲user_id
    Name string `orm:"size(100)"column(user_name)`
    Sex  int `orm:"size(2);column(gender)"`
    CreateDate time.Time `orm:"type(date);column(create_date)"`
    Age int `orm:size(10);column(age)`
}
//注意:以上的字段名必須大寫,不然沒法識別

在進行模型結構定義須要注意的是(模型結構定義也就是表字段定義,beego中的orm框架會自動給你生成模型定義對應的表):git

關於表名:默認是生成以結構名小寫而且加上s結尾的表名,也能夠自行設置表名github

func (u *模型結構名) TableName() string {
    return "你設置的表名"
}

關於索引定義:能夠爲單個字段或多個字段添加索引golang

// 多字段索引
func (u *模型結構名) TableIndex() [][]string {
    return [][]string{
        []string{"字段1", "字段2"},
    }
}

// 多字段惟一鍵
func (u *模型結構名) TableUnique() [][]string {
    return [][]string{
        []string{"字段1", "字段2"},
    }
}
寫法都是固定了,只要按照這樣的方式寫就能夠了

關於自定義引擎:對mysql能夠支持自定義引擎sql

// 設置引擎爲 INNODB
func (u *模型結構名) TableEngine() string {
    return "INNODB"
}

關於字段屬性的設置:例如字段大小,字段的爲空不爲空等設置數據庫

多個設置間使用 ; 分隔,設置的值若是是多個,使用 , 分隔。json

在設置屬性時都是以orm:"你的設置"開頭app

設置int類型一般爲id字段自增而且爲主鍵:orm:"pk;auto"

爲空設置:數據庫表默認爲 NOT NULL,設置 null 表明 ALLOW NULL

Name string orm:"null" 表示name字段能夠爲空

爲單個字段添加索引或者惟一索引:Name strig orm:"index" 或者`Name string orm:"unique"

爲字段設置對應的列名: Name string orm:"column(user_name)"

設置字段的大寫設置 size 之後,db type 將使用 varchar(size): Name string orm:"size(10)"

爲字段設置浮點數精度:Money float64 orm:"digits(12);decimals(4)" 結果顯示9999.9999

時間類型的設置

設置爲 date 時,time.Time 字段的對應 db 類型使用 date

Created time.Time `orm:"auto_now_add;type(date)"`

設置爲 datetime 時,time.Time 字段的對應 db 類型使用 datetime

Created time.Time `orm:"auto_now_add;type(datetime)"`

設置爲字段添加註釋:註釋中禁止包含引號

Status int orm:"default(1)" description:"這是狀態字段"

第三步:進行初始化操做,主要進行創建數據庫鏈接,以及註冊模型結構,建表等操做。

func init() {
    //註冊數據庫,一共有五個參數,後面連個用於鏈接池操做
	_ = orm.RegisterDataBase("default", "mysql",
		"root:123456@tcp(172.16.163.128:3307)/goodsinfo?charset=utf8")
    //進行註冊模型結構,能夠有多個,用逗號分隔
	orm.RegisterModel(new(Stu))
    //建立表,默認爲default,只創建一次,後面再執行這個會忽略
	_ = orm.RunSyncdb("default", false, true)
}

注:以上沒有引入關聯關係操做

第四步:編寫sql語句進行操做mysql數據庫

//查詢全部學生信息
func SelectAll() []orm.Params  {
	o := orm.NewOrm()
	var maps []orm.Params
	_, _ = o.Raw("select * from stu_stu").Values(&maps)
	return maps
}

//根據id查詢學生信息
func SelectById(id int) Stu  {
	o:=orm.NewOrm()
	_ = o.Raw("select * from stu_stu where id=?", id).QueryRow(&stu)
	return stu
}

//根據id刪除用戶
func Deletebyid(id int) {
	o := orm.NewOrm()
	_ = o.Raw("delete from stu_stu where id = ?", id).QueryRow(&stu)
}

//根據id更新信息
func Updatebyid(id int,name string) {
	o:=orm.NewOrm()
	_ = o.Raw("update stu_stu set name=? where id=?", name, id).QueryRow(&stu)
}

//插入數據
func InsertData(id int,name string)  {
	o:=orm.NewOrm()
	_ = o.Raw("insert into stu_stu values(?,?)", id, name).QueryRow(&stu)
}

//根據name進行模糊查詢
func SelectUnClear(name string) []orm.Params  {
	o := orm.NewOrm()
	var maps []orm.Params
	_, _ = o.Raw("select * from stu_stu where name like ?","%"+name+"%").Values(&maps)
	return maps
}

控制器編寫而且返回json數據

package controllers

import (
	"github.com/astaxie/beego"
	"github.com/astaxie/beego/orm"
	"goorm/models"
)

type SelectAll struct {
	beego.Controller
}
//全局變量
var stu models.Stu
//查詢全部信息
func (c *SelectAll) Get() {
	var maps []orm.Params
	maps = models.SelectAll()
	c.Data["json"]=maps
	c.ServeJSON()
}

type SelectbyId struct {
	beego.Controller
}

//根據id查詢用戶
func (c *SelectbyId) Get() {
	id, _ := c.GetInt(":id")
	stu = models.SelectById(id)
	c.Data["json"]=stu
	c.ServeJSON()
}

//根據id刪除用戶
type DeletebyId struct {
	beego.Controller
}

func (c *DeletebyId) Get() {
	id, _ := c.GetInt(":id")
	models.Deletebyid(id)
	str:=models.SelectAll()
	c.Data["json"]=str
	c.ServeJSON()
}
//根據id更新信息
type Updatebyid struct {
	beego.Controller
}

func (c *Updatebyid) Get()  {
	id,_:=c.GetInt(":id")
	name:=c.GetString(":name")
	models.Updatebyid(id,name)
	str:=models.SelectAll()
	c.Data["json"]=str
	c.ServeJSON()
}

//插入數據
type InsertData struct {
	beego.Controller
}

func (c *InsertData) Get()  {
	id, _ :=c.GetInt(":id")
	name:=c.GetString(":name")
	models.InsertData(id,name)
	str:=models.SelectAll()
	c.Data["json"]=str
	c.ServeJSON()
}

//模糊查詢
type SelectUnClear struct {
	beego.Controller
}

func (c *SelectUnClear) Get()  {
	name:=c.GetString(":name")
	var maps []orm.Params
	maps = models.SelectUnClear(name)
	c.Data["json"]=maps
	c.ServeJSON()
}

以上就是beego引入orm框架操做mysql數據庫的簡單練習

數據多模式輸出 ---json,xml,jsonp

beego 當初設計的時候就考慮了 API 功能的設計,而咱們在設計 API 的時候常常是輸出 JSON 或者 XML 數據,那麼 beego 提供了這樣的方式直接輸出:

注意 struct 屬性應該 爲 exported Identifier 也就是首字母應該大寫

  • JSON 數據直接輸出:

    func (this *AddController) Get() {
        mystruct := { ... }
        this.Data["json"] = &mystruct
        this.ServeJSON()
    }

    調用 ServeJSON 以後,會設置 content-typeapplication/json,而後同時把數據進行 JSON 序列化輸出。

  • XML 數據直接輸出:

    func (this *AddController) Get() {
        mystruct := { ... }
        this.Data["xml"]=&mystruct
        this.ServeXML()
    }

    調用 ServeXML 以後,會設置 content-typeapplication/xml,同時數據會進行 XML 序列化輸出。

  • jsonp 調用

    func (this *AddController) Get() {
        mystruct := { ... }
        this.Data["jsonp"] = &mystruct
        this.ServeJSONP()
    }

    調用 ServeJSONP 以後,會設置 content-typeapplication/javascript,而後同時把數據進行 JSON 序列化,而後根據請求的 callback 參數設置 jsonp 輸出。

開發模式下序列化後輸出的是格式化易閱讀的 JSON 或 XML 字符串;在生產模式下序列化後輸出的是壓縮的字符串。


golang頁面模板tpl從列表中循環取值

{{range .mydata}} <option value="{{.id}},{{.name}}">[ {{.id}},{{.name}} ]</option> {{end}}

若是是返回的是對象列表:例如:[{...}{....}{....}],如今我想取裏面的第一個{}內容,使用**{{index .Keys 1}}**便可。

若是是想取結構體裏面某一個字段的值則使用:{{(index .Keys 1).propert_name}}

相關文章
相關標籤/搜索