百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

beego ORM框架(beego框架怎么样)

ccwgpt 2024-09-17 12:27 38 浏览 0 评论

beego中内嵌了ORM框架, ORM框架可以将结构体和数据表进行对应起来, 只需要通过结构体和对象就可以对数据表进行操作。

设计类:模型类。

ORM另外一个作用:根据设计的类生成数据库中的表。

安装ORM

go get github.com/astaxie/beego/orm

执行的位置

D:\Go\study\src\class>go get github.com/astaxie/beego/orm

1 创建表

main.go

package main
import (
_ "class/models" /* 加载模型文件 */
_ "class/routers"
"github.com/astaxie/beego"
)
func main() {
beego.Run()
}

models/model.go

package models
import (
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
)
type User struct {
Id int
Name string
Pwd string
}
func init() {
// 设置数据库基本信息
orm.RegisterDataBase("default", "mysql", "root:root@tcp(127.0.0.1:3307)/blog?charset=utf8")
/*
参数1 数据库的别名,用来在 ORM 中切换数据库使用
参数2 driverName
参数3 对应的链接字符串
*/
// 映射model数据
orm.RegisterModel(new(User)) //user表名
// 生成表
orm.RunSyncdb("default", false, true)
/*
default: 数据库别名 第二个参数 false:不需要更新表 true 需要更新表 第三个参数: 创建表的过程是否可见
*/
}

执行bee run命令

D:\Go\study\src\class>bee run
______
| ___ \
| |_/ / ___ ___
| ___ \ / _ \ / _ \
| |_/ /| __/| __/
\____/ \___| \___| v1.10.0
2018/12/09 22:40:47 INFO ? 0001 Using 'class' as 'appname'
2018/12/09 22:40:47 INFO ? 0002 Initializing watcher...
class
2018/12/09 22:40:54 SUCCESS ? 0003 Built Successfully!
2018/12/09 22:40:54 INFO ? 0004 Restarting 'class.exe'...
2018/12/09 22:40:54 SUCCESS ? 0005 './class.exe' is running...
create table `user`
-- --------------------------------------------------
-- Table Structure for `class/models.User`
-- --------------------------------------------------
CREATE TABLE IF NOT EXISTS `user` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`name` varchar(255) NOT NULL DEFAULT '' ,
`pwd` varchar(255) NOT NULL DEFAULT ''
) ENGINE=InnoDB;
2018/12/09 22:40:56.956 [I] [asm_amd64.s:1333] http server Running on http://:8080

2 ORM插入数据

controllers/default.go

package controllers
import (
    "class/models" /* 导入模型 */
    "github.com/astaxie/beego"
    "github.com/astaxie/beego/orm"
)
type MainController struct {
    beego.Controller
}
func (c *MainController) Get() {
    // 1. 有ORM对象
    o := orm.NewOrm()
    // 2. 有一个要插入数据的结构体对象
    user := models.User{}
    // 3. 对结构体赋值
    user.Name = "xuchenkai"
    user.Pwd = "123456"
    // 4. 插入
    _, err := o.Insert(&user)
    if err != nil {
        beego.Info("插入失败", err)
        return
    }
    c.Data["data"] = "今天中午吃饺子"
    c.TplName = "test.html"
}
func (c *MainController) Post() {
    c.Data["data"] = "今天中午吃面条"
    c.TplName = "test.html"
}

3 ORM查询

package controllers
import (
    "class/models"
    "github.com/astaxie/beego"
    "github.com/astaxie/beego/orm"
)
type MainController struct {
    beego.Controller
}
func (c *MainController) Get() {
    // 1. 有ORM对象
    o := orm.NewOrm()
    // 2. 查询对象
    user := models.User{}
    // 3. 指定查询对象字段值(字段值首字母要注意大写)
    //user.Id = 1
    user.Name = "xuchenkai"
    // 4. 查询
    //err := o.Read(&user) //根据id查询
    err := o.Read(&user, "Name") //根据Name查询, 必须传递第二个参数"Name"
    if err != nil {
    beego.Info("查询失败", err)
    }
    beego.Info("查询成功", user)
    c.Data["data"] = "今天中午吃饺子"
    c.TplName = "test.html"
  }
func (c *MainController) Post() {
    c.Data["data"] = "今天中午吃面条"
    c.TplName = "test.html"
}

4 ORM更新

package controllers
import (
"class/models"
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
)
type MainController struct {
beego.Controller
}
func (c *MainController) Get() {
// 1. 有ORM对象
o := orm.NewOrm()
// 2. 需要更新的结构体对象
user := models.User{}
//3 查询需要更新的数据
user.Id = 1
err := o.Read(&user)
// 4 给数据赋值
if err == nil {
user.Name = "pengjihan"
user.Pwd = "123456789"
// 更新
_, err = o.Update(&user)
if err != nil {
beego.Info("更新失败", err)
return
}
}
c.Data["data"] = "今天中午吃饺子"
c.TplName = "test.html"
}
func (c *MainController) Post() {
c.Data["data"] = "今天中午吃面条"
c.TplName = "test.html"
}

ORM 删除

package controllers
import (
    "class/models"
    "github.com/astaxie/beego"
    "github.com/astaxie/beego/orm"
)
type MainController struct {
    beego.Controller
}
func (c *MainController) Get() {
    // 1. 有ORM对象
    o := orm.NewOrm()
    // 2. 删除的对象
    user := models.User{}
    // 3. 指定删除哪一条数据
    user.Id = 1
    // 4 删除
    _, err := o.Delete(&user)
    if err != nil {
        beego.Info("删除错误", err)
        return
    }
    c.Data["data"] = "今天中午吃饺子"
     c.TplName = "test.html"
}
func (c *MainController) Post() {
    c.Data["data"] = "今天中午吃面条"
    c.TplName = "test.html"
}
一对多查询
//用户结构体
type User struct {
    Id int
    Name string `orm:"unique"`
    Pwd string
    Articles []*Article `orm:"rel(m2m)"` //与Article建立多对多的关系, 建立中间表user_articles
}
/*
文章结构体 字段命名规则: 不要出现下划线(会出现两个下划线),
除了首字母大写外, 字段中出现第二个大写, 将会新建一个下划线
如: ArticleName => article_name
*/
type Article struct {
    Id int `orm:"pk;auto"`
    ArtiName string `orm:"size(20)"` //文章标题
    Atime time.Time `orm:"auto_now"` //内容
    Acount int `orm:"default(0);null"`
    Acontent string
    Aimg string
    ArticleType *ArticleType `orm:"rel(fk)"` //外键约束 与 ArticleType 建立一对多关系
    Users []*User `orm:"reverse(many)"` //与User立多对多的关系, 建立中间表user_articles
}
type ArticleType struct {
    Id int
    TypeName string `orm:"size(20)"`
    Articles []*Article `orm:"reverse(many)"` //与Article建立多对一的关系
}

一对多关系查询时必须使用RelatedSel(), 不然查不到数据, 参数要指定关联的表, 不然数据不正确

count, err = o.QueryTable("Article").RelatedSel("ArticleType").Count() //两个表建立了外键约束的关系

多对多插入

//多对多插入读者 插入到中间表
//1 获取操作对象
article := models.Article{Id: id}
//2 获取多对多操作对象
m2m := o.QueryM2M(&article, "Users") //article和user表建立了多对多的关系
//3 获取插入对象
userName := c.GetSession("userName") //获取登录的用户
user := models.User{}
user.Name = userName.(string)
o.Read(&user, "Name") //读取用户 写入到user结构体中 Name 查询的条件
//4 多对多插入
_, err = m2m.Add(&user)
if err != nil {
beego.Info("插入失败")
}

多对多查询

o.LoadRelated(&arti, "Users")

相关推荐

用Deepseek扩写土木工程毕业论文实操指南

用Deepseek扩写毕业论文实操指南一、前期准备整理现有论文初稿/提纲列清楚论文核心框架(背景、现状、意义、方法、数据、结论等)梳理好关键文献,明确核心技术路线二、Deepseek扩写核心思路...

985学霸亲授,DeepSeek也能绘6大科研图表,5分钟就出图

在实验数据处理中,高效可视化是每个科研人的必修课。传统绘图软件操作复杂、耗时费力,而智能工具DeepSeek的出现彻底改变了这一现状。本文将详解如何用DeepSeek一键生成六大科研常用图表,从思维导...

AI写论文刷屏?大学生正在丢掉的思考力

一、宿舍深夜:当论文变成"Ctrl+C+V"凌晨两点的大学宿舍,小王对着电脑屏幕叹气。本该三天前开始写的近代史论文,此刻还一片空白。他熟练打开某AI写作网站,输入"论五四运动的...

Grok在辅助论文写作上能不能既“聪明”又“可怕”?!

AcademicIdeas-学境思源AI初稿写作随着人工智能技术的飞速发展,论文写作这一学术任务正迎来新的助力。2025年2月18日,美国xAI公司推出了备受瞩目的Grok3模型,其创始人埃隆·...

大四论文沟通场景!音频转文字难题听脑AI来化解

大四学生都知道,写论文时和导师沟通修改意见,简直是“过关斩将”。电话、语音沟通完,想把导师说的修改方向、重点要求记下来,麻烦事儿可不少。手写记不全,用普通录音转文字工具,转完还得自己慢慢找重点,稍不注...

论文写作 | 技术路线图怎么画?(提供经典优秀模板参考)

技术路线图是一种图表或文字说明,用于描述研究目标、方法和实施计划。它展示了研究的整体框架和步骤,有助于读者理解研究的逻辑和进展。在课题及论文中,技术路线图是常见的一部分,甚至是一个类似心脏一样的中枢器...

25年信息系统项目管理师考试第2批论文题目写作建议思路框架

25年信息系统项目管理师考试第2批论文题目写作建议思路框架--马军老师

微信购物应尽快纳入法律框架(微信购物管辖)

符向军近日,甘肃省工商行政管理局发布《2016年上半年信息分析报告》。报告显示,微信网购纠纷迅猛增长,网络购物投诉呈上升趋势。投诉的主要问题有出售的商品质量不过关、消费者通过微信付款后对方不发货、购买...

泛珠三角区域网络媒体与腾讯微信签署《战略合作框架协议》

新海南客户端、南海网7月14日消息(记者任桐)7月14日上午,参加第四届泛珠三角区域合作网络媒体论坛的区域网络媒体负责人及嘉宾一行到腾讯微信总部座谈交流,并签署《战略合作框架协议》(以下简称《框架协...

离线使用、植入微信-看乐心Mambo手环如何打破框架

从2014年开始智能手环就成功进入人们的生活,至今已经演变出数据监测、信息推送、心率监测等诸多五花八门的功能,人们选择智能手环并不指望其能够改变身体健康情况,更多的是通过数据来正视自身运动情况和身体健...

微信私域电商运营策略与框架(微信私域怎么做)

...

华专网络:如何零基础制作一个网站出来?

#如何零基础制作一个网站出来?#你是不是觉得网站建设很复杂,觉得自己是小白,需求不明确、流程搞不懂、怕被外包公司坑……这些问题我都懂!今天华专网络就用大白话给你捋清楚建站的全流程,让你轻松get网站制...

WAIC2024丨明日上午9点,不见不散!共同探讨智能社会与全球治理框架

大咖云集,硕果闪耀WAIC2024世界人工智能大会智能社会论坛将于7月5日9:00-12:00与你相约直播间WAIC2024上海杨浦同济大学哔哩哔哩多平台同步直播探讨智能社会与全球治理框架WAIC...

约基奇:森林狼换来戈贝尔时大家都在嘲笑 他们的阵容框架很不错

直播吧5月4日讯西部季后赛半决赛,掘金将迎战森林狼,约基奇赛前接受采访。约基奇说道:“当蒂姆-康纳利(森林狼总经理、前掘金总经理&曾选中约基奇)做了那笔交易(换来戈贝尔)时,每个人都在嘲笑他...

视频号带货为什么一个流量都没有?顶级分析框架送给你

视频号带货为什么一个流量都没有?遇到问题,一定是步步来分析内容,视频号带货一个流量都没有,用另外一个意思来讲,就可以说是零播放。为什么视频号带货一个流量都没有?跟你说再多,都不如来个分析框架。1、是否...

取消回复欢迎 发表评论: