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