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-type
為application/json
,然后同時把數據進行 JSON 序列化輸出。 -
XML 數據直接輸出:
func (this *AddController) Get() { mystruct := { ... } this.Data["xml"]=&mystruct this.ServeXML() }
調用 ServeXML 之后,會設置
content-type
為application/xml
,同時數據會進行 XML 序列化輸出。 -
jsonp 調用
func (this *AddController) Get() { mystruct := { ... } this.Data["jsonp"] = &mystruct this.ServeJSONP() }
調用 ServeJSONP 之后,會設置
content-type
為application/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}}