Go語言之高級篇beego框架之模型(Models)


一、模型(Models)

1、beego-orm的相關特性 

  •  支持 Go 的所有類型存儲 
  • -輕松上手,采用簡單的 CRUD 風格 
  • -自動 Join 關聯表 
  •  跨數據庫兼容查詢 
  • 允許直接使用 SQL 查詢/映射 
  •  嚴格完整的測試保證 ORM 的穩定與健壯 

2、安裝ORM

go get github.com/astaxie/beego/orm

3、ORM接口

type Ormer interface {
Read(interface{}, …string) error
ReadOrCreate(interface{}, string, …string) (bool, int64, error)
Insert(interface{}) (int64, error)
InsertMulti(int, interface{}) (int64, error)
Update(interface{}, …string) (int64, error)
Delete(interface{}) (int64, error)
LoadRelated(interface{}, string, …interface{}) (int64, error)
QueryM2M(interface{}, string) QueryM2Mer
QueryTable(interface{}) QuerySeter
Using(string) error
Begin() error
Commit() error
Rollback() error
Raw(string, …interface{}) RawSeter
Driver() Driver
}

3、數據庫的設置,支持三種數據庫

將你需要使用的 driver 加入 import 中

import (
    _ "github.com/go-sql-driver/mysql"
    _ "github.com/lib/pq"
    _ "github.com/mattn/go-sqlite3"
) 

引入包后,需要注冊

#連接mysql數據庫

orm.RegisterDataBase("default", "mysql", "root:root@/orm_db?charset=utf8",30)

orm.RegisterModel(new(User))

4、操作model的方法

    o := orm.NewOrm()
    user := User{Name: "slene"}
    // insert
    id, err := o.Insert(&user)
    // update
    user.Name = "astaxie"
    num, err := o.Update(&user)
    // read one
    u := User{Id: user.Id}
    err = o.Read(&u)
    // delete
    num, err = o.Delete(&u)

在mysql中要小寫,這是約寫。大寫會對應小寫,需加下划線。

AuthUser -> auth_user
Auth_User -> auth__user
DB_AuthUser -> d_b__auth_user

  

示例:

創建表語句

use test
create table user_info(id int(11) auto_increment, username varchar(32), password varchar(256), primary key(id));

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| user_info |
+----------------+
1 row in set (0.00 sec)

  

 示例: 插入和更新數據

routers/router.go

package routers

import (
	"web/controllers"

	"github.com/astaxie/beego"
)

func init() {
	beego.Router("/", &controllers.MainController{})
	beego.Router("/test_model", &controllers.TestModelController{}, "get:Get;post:Post")
}

controllers/testModel.go

package controllers

import (
	"fmt"
	"github.com/astaxie/beego"
	"github.com/astaxie/beego/orm"
	_ "github.com/go-sql-driver/mysql"
)

//由於model這個名字叫UserInfo,那么操作的表其實是user_info
type UserInfo struct {
	Id       int64
	Username string
	Password string
}

type TestModelController struct {
	beego.Controller
}

func (c *TestModelController) Get() {
	orm.RegisterDataBase("default", "mysql", "root:qwe!23@tcp(127.0.0.1:3306)/test?charset=utf8", 30)
	orm.RegisterModel(new(UserInfo))

	o := orm.NewOrm()
	//插入數據
	//user := UserInfo{Username: "zhangsan", Password: "123456"}
	//id, err := o.Insert(&user)

	//更新數據
	user := UserInfo{Username: "list", Password: "123456"}
	user.Id = 1
	user.Username = "nulige"
	id, err := o.Update(&user)

	//以字符串,直接輸出
	c.Ctx.WriteString(fmt.Sprintf("id:%d err:%v", id, err))
}

執行結果:

D:\GoFiles\src\WEB>bee run
______
| ___ \
| |_/ /  ___   ___
| ___ \ / _ \ / _ \
| |_/ /|  __/|  __/
\____/  \___| \___| v1.10.0
2019/02/13 17:09:58 INFO     ▶ 0001 Using 'WEB' as 'appname'
2019/02/13 17:09:58 INFO     ▶ 0002 Initializing watcher...
web/controllers
web/routers
2019/02/13 17:10:02 SUCCESS  ▶ 0003 Built Successfully!
2019/02/13 17:10:02 INFO     ▶ 0004 Restarting 'WEB.exe'...
2019/02/13 17:10:02 SUCCESS  ▶ 0005 './WEB.exe' is running...
2019/02/13 17:10:02.621 [I] [asm_amd64.s:1333]  http server Running on http://:8
080
[beego] 2019/02/13 - 17:10:04 |      127.0.0.1| 200 |         24ms|   match| GET
      /test_model   r:/test_model

打開瀏覽器,訪問:

http://127.0.0.1:8080/test_model

返回結果:
id:1 err:<nil>

#mysql數據庫中查詢結果
mysql>use test

#修改前是list
mysql> select * from user_info;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | list     | 123456   |
+----+----------+----------+
1 row in set (0.00 sec)

#修改后變成nulige
mysql> select * from user_info;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | nulige   | 123456   |
+----+----------+----------+
1 row in set (0.00 sec)

  

示例:讀取數據

mysql數據庫中數據

mysql> select * from user_info;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | nulige   | 123456   |
+----+----------+----------+
1 row in set (0.00 sec)

讀取數據

controllers/testModel.go

package controllers

import (
	"fmt"
	"github.com/astaxie/beego"
	"github.com/astaxie/beego/orm"
	_ "github.com/go-sql-driver/mysql"
)

//由於model這個名字叫UserInfo,那么操作的表其實是user_info
type UserInfo struct {
	Id       int64
	Username string
	Password string
}

type TestModelController struct {
	beego.Controller
}

func (c *TestModelController) Get() {
	orm.RegisterDataBase("default", "mysql", "root:qwe!23@tcp(127.0.0.1:3306)/test?charset=utf8", 30)
	orm.RegisterModel(new(UserInfo))

	o := orm.NewOrm()
	//讀取
	user := UserInfo{Username: "nulige", Password: "123456"}
	user.Id = 1

	o.Read(&user)

	//直接輸出
	c.Ctx.WriteString(fmt.Sprintf("user info:%v", user))
}

執行結果:

在瀏覽器中輸入:
http://127.0.0.1:8080/test_model

結果:
user info:{1 nulige 123456}

 刪除

 刪除數據    

stmt, err = db.Prepare("delete from user_info where uid=?")   
res, err = stmt.Exec(id)

  

5、SQL直接查詢

routers/router.go

package routers

import (
	"web/controllers"

	"github.com/astaxie/beego"
)

func init() {
	beego.Router("/", &controllers.MainController{})
	beego.Router("/test_model", &controllers.TestModelController{}, "get:Get;post:Post")
}

controllers/testModel.go

package controllers

import (
	"fmt"

	"github.com/astaxie/beego"
	"github.com/astaxie/beego/orm"
	_ "github.com/go-sql-driver/mysql"
)

//由於model這個名字叫 UserInfo 那么操作的表其實 user_info
type UserInfo struct {
	Id       int64
	Username string
	Password string
}

type TestModelController struct {
	beego.Controller
}

func (c *TestModelController) Get() {
	orm.Debug = true // 是否開啟調試模式 調試模式下會打印出sql語句
	orm.RegisterDataBase("default", "mysql", "root:qwe!23@tcp(127.0.0.1:3306)/test?charset=utf8", 30)
	orm.RegisterModel(new(UserInfo))

	o := orm.NewOrm()

	//原生sql語句讀取
	var maps []orm.Params
	o.Raw("select * from user_info").Values(&maps)

	for _, v := range maps {
		c.Ctx.WriteString(fmt.Sprintf("user info:%v", v))
	}
}

執行結果

http://127.0.0.1:8080/test_model

返回結果:
user info:map[id:1 username:nulige password:123456]

6、通過QueryRows讀取
controllers/testModel.go
package controllers

import (
	"fmt"
	"github.com/astaxie/beego"
	"github.com/astaxie/beego/orm"
	_ "github.com/go-sql-driver/mysql"
)

//由於model這個名字叫 UserInfo 那么操作的表其實 user_info
type UserInfo struct {
	Id       int64
	Username string
	Password string
}

type TestModelController struct {
	beego.Controller
}

func (c *TestModelController) Get() {
	orm.Debug = true // 是否開啟調試模式 調試模式下會打印出sql語句
	orm.RegisterDataBase("default", "mysql", "root:qwe!23@tcp(127.0.0.1:3306)/test?charset=utf8", 30)
	orm.RegisterModel(new(UserInfo))

	o := orm.NewOrm()

	//通過QueryRows讀取
	var users []UserInfo
	o.Raw("select * from user_info").QueryRows(&users)
	c.Ctx.WriteString(fmt.Sprintf("user info:%v", users))
}

執行結果:

http://127.0.0.1:8080/test_model

返回結果:
user info:[{1 nulige 123456}]

  





免責聲明!

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



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