golang利用beego框架orm操作mysql


GO引入orm框架操作mysql

在beego框架中引入orm操作mysql需要進行的步驟:

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

import (
	"github.com/astaxie/beego/orm"     //導入orm框架
	_ "github.com/go-sql-driver/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框架會自動給你生成模型定義對應的表):

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

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

關於索引定義:可以為單個字段或多個字段添加索引

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

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

關於自定義引擎:對mysql可以支持自定義引擎

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

關於字段屬性的設置:例如字段大小,字段的為空不為空等設置

多個設置間使用 ; 分隔,設置的值如果是多個,使用 , 分隔。

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

設置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}}


免責聲明!

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



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