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

  


Go语言之高级篇beego框架之模型(Models)的更多相关文章

  1. Go语言之高级篇beego框架安装与使用

    一.beego框架 1.beego框架简介 beego 是一个快速开发 Go 应用的 HTTP 框架,他可以用来快速开发 API.Web 及后端服务等各种应用,是一个 RESTful 的框架,主要设计 ...

  2. Go语言之高级篇beego框架之layui框架应用

    1.layui前端框架 参考地址:https://www.layui.com

  3. Go语言之高级篇beego框架之配置beego环境

    1.配置beego环境 进入部署目录中 软件部署目录: 把要部署的软件代码,放在src目录下面. 启动项目

  4. Go语言之高级篇Beego框架之爬虫项目实战

    一.爬虫项目 1.爬虫基础 a.网页上面会有相同的数据 b.去重处理 布隆过滤器哈希存储 c.标签匹配: 正则表达式beautiful soup或lxml这种标签提取库 d.动态内容 phantomj ...

  5. Go语言之高级篇beego框架之config、httplib、context

    一.httplib 1.配置文件解析 这是一个用来解析文件的库,它的设计思路来自于 database/sql,目前支持解析的文件格式有 ini.json.xml.yaml,可以通过如下方式进行安装: ...

  6. Go语言之高级篇beego框架之view

    1.基本语法 go统一使用了{{ 和 }}作为左右标签,没有其它的标签符号. 如果你想要修改为其它符号,可以修改配置文件. 使用.来访问当前位置的上下文 使用$来引用当前模板根级的上下文 2.使用方法 ...

  7. Go语言之高级篇beego框架之controller调用model

    一.controller调用model 开发规范,就该把对数据库的操作写在model文件夹中. 示例: views/main.go package main import ( _ "web/ ...

  8. Go语言之高级篇beego框架之model设计构造查询

    一.model设计构造查询 QueryBuilder 提供了一个简便,流畅的 SQL 查询构造器.在不影响代码可读性的前提下用来快速的建立 SQL 语句. QueryBuilder 在功能上与 ORM ...

  9. Go语言之高级篇beego框架之cookie与session

    1.cookie的用法 this.Ctx.SetCookie("name", name, maxage, "/") this.Ctx.SetCookie(&qu ...

随机推荐

  1. 在CentOS 7上安装Node.js的4种方法

    一.源码安装 1.下载源码(官网查看最新版本链接) wget http://nodejs.org/dist/v0.10.30/node-v0.10.30.tar.gz 2.解压源码 tar xzvf ...

  2. Yii2文件上传

    首先在app\controllers下建立TestController.php,内容为如下代码: <?php namespace app\controllers; use Yii; use yi ...

  3. 全国信息学奥林匹克联赛 ( NOIP2014) 复赛 模拟题 Day1 长乐一中

    题目名称 正确答案  序列问题 长途旅行 英文名称 answer sequence travel 输入文件名 answer.in sequence.in travel.in 输出文件名 answer. ...

  4. 【NOI2001】炮兵阵地

    [题目描述] 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形 ...

  5. IIS判断W3WP进程对应哪个网站

    IIS 6 (Win2003 )中查看某个应用程序池对应那个 W3WP.exe 进程,可以使用如下命令,输出结果类似如下: C:\WINDOWS\system32>cscript iisapp. ...

  6. ORACLE 程序包

    程序包由PL/SQL程序元素(变量,类型)和匿名PL/SQL(游标),命名PL/SQL 块(存储过程和函数)组成. 程序包可以被整体加载到内存中,这样可以大大加快程序包中任何一个组成部分的访问速度. ...

  7. Go 只读/只写channel

    Go中channel可以是只读.只写.同时可读写的. //定义只读的channel read_only := make (<-chan int) //定义只写的channel write_onl ...

  8. SQL Server通过BCP进行大批量数据导入导出

    预置条件: 使用sa帐号登录SQL Server Management Studio,右键点击安全性-登录名-数据库用户名属性,设置服务器角色为sysadmin. 删除已存在的存储过程 String ...

  9. How to set asp.net Identity cookies expires time

    If IsPersistent property of AuthenticationProperties is set to false, then the cookie expiration tim ...

  10. CVE-2018-7566

    概念解读 什么是竞争条件? 由于两个或者多个进程竞争使用不能被同时访问的资源,使得这些进程有可能因为时间上推进的先后原因而出现问题,这叫做竞争条件(Race Condition). 什么是互斥锁? 在 ...