一、模型(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}]
