Beego和Mongodb杂记

1. Beego框架的简介与安装

1.1 Beego简介

beego是一个快速开发Go应用的HTTP框架,他可以用来快速开发API、Web及后端服务等各种应用,是一个经典的MVC框架

  1. Beego官网

    beego.me
    

目录结构入下:mian.go是入口文件,controllers是逻辑控制模块,models是模型模块,views是视图模块。

├── conf
│   └── app.conf
├── controllers
│   ├── admin
│   └── default.go
├── main.go
├── models
│   └── models.go
├── static
│   ├── css
│   ├── ico
│   ├── img
│   └── js
└── views
    ├── admin
    └── index.tpl

2. Beego下载安装

go get github.com/beego/beego/[email protected]

3. Bee安装

beego还有一个工具bee用于协助快速开发beego项目,通过bee可以很 容易的进行构建、热编译、开发、测试和部署。 bee工具可以使用go指令直接下载安装:

go get github.com/beego/bee

4. 验证

最后执行,出现版本信息

bee version
bee new filename  创建新的文件

cd filename 切换到了文件

bee run  运行

浏览器输入 localhost:8080

2. 执行流程

1、首先我们引入了包github.com/astaxie/beego,我们知道Go语言里面引入包会深度优先的去执行引入包的初始化(变量和init函数),beego包中会初始化一个BeeAPP的应用,初始化一些参数。

2、定义Controller,这里我们定义了一个struct为MainController,充分利用了Go语言的组合的概念,匿名包含了beego.Controller,这样我们的MainController就拥有了beego.Controller的所有方法。

3、定义main函数,所有的Go应用程序和C语言一样都是Main函数作为入口,所以我们这里定义了我们应用的入口。

4、Router注册路由,路由就是告诉beego,当用户来请求的时候,该如何去调用相应的Controller,这里我们注册了请求/的时候,请求到MainController。这里我们需要知道,Router函数的两个参数函数,第一个是路径,第二个是Controller的指针。

5、Run应用,最后一步就是把在1中初始化的BeeApp开启起来,其实就是内部监听了8080端口

3. Bee的命令

3.1 new命令

new命令是新建一-个Web项目,我们在命令行下执行bee new <项目名>就可以创建一一个新的项目。但是注 意该命令必须在$GOPATH/src下执行。

3.2 api命令

bee api myapi

3.3 run命令

bee run 命令是监控 beego 的项目,通过 fsnotify监控文件系统。但是注意该命令必须在 $GOPATH/src/projectName 下执行。这样当我们在开发过程中,beego可以实时监测我们的代码文件发生变化,这样我们就不用重新编译运行,非常方便我们调试。

3.4 Bee的其他命令

version     Prints the current Bee version
 migrate     Runs database migrations
 api         Creates a Beego API application
 bale        Transforms non-Go files to Go source files
 fix         Fixes your application by making it compatible with newer versions of Beego
 dlv         Start a debugging session using Delve
 dockerize   Generates a Dockerfile for your Beego application
 generate    Source code generator
 hprose      Creates an RPC application based on Hprose and Beego frameworks
 new         Creates a Beego application
 pack        Compresses a Beego application into a single file
 rs          Run customized scripts
 run         Run the application by starting a local development server
 server      serving static content over HTTP on port

4. Beego的Controller使用

  1. controller就是处理具体的逻辑的,router将请求分发到指定的controlller,controller处理请求,然后返回,基于beego的Controller 设计,只需要匿名组合beego.Controller

    type xxxController struct {
        beego.Controller
    }
    

    beego.Controller拥有很多方法,其中包括Init、Prepare、 Post、 Get、Delete、 Head等方法。我们可以通过重写的方式来实现这些方法。

    4.1 Controller的结构体

    首先我们来看看Controller结构体,以及定义的方法

    type Controller struct {
        // context data
        Ctx  *context.Context
        Data map[interface{}]interface{}
    
        // route controller info
        controllerName string
        actionName     string
        methodMapping  map[string]func() //method:routertree
        gotofunc       string
        AppController  interface{}
    
        // template data
        TplName        string
        ViewPath       string
        Layout         string
        LayoutSections map[string]string // the key is the section name and the value is the template name
        TplPrefix      string
        TplExt         string
        EnableRender   bool
    
        // xsrf data
        _xsrfToken string
        XSRFExpire int
        EnableXSRF bool
    
        // session
        CruSession session.Store
    }
    

    从controller的结构体我们可以看到,一共有5大块:

    1.上下文数据

    2.路由控制信息

    3.模板数据

    4.xsrf数据

    5.session

4.2 ControllerInterface

从ControllerInterface 我们可以看到Controller 拥有很多方法,其中包括 Init、Prepare、Post、Get、Delete、Head 等方法。我们可以通过重写的方式来实现这些方法,而我们上面的代码就是重写了 Get 方法。

5. Beego之Cookie

1.Http是无状态的协议,服务器不能记录浏览器的访问状态,也就是服务器不能区分两次请求是否是来自同一个客户端。

2.Cookie实际上是服务器保存在浏览器上的一段信息,浏览器有了Cookie之后,每次向服务器发送请求都会带着该信息进行访问,服务器在收到请求之后,就可以通过该信息进行处理。

3.Cookie由服务器创建,并发给浏览器,最终由浏览器保存。

Cookie一般用于保持用户登陆状态,电商网站的购物车等

Beego操作Cookie,无非就是两个方法,一个是设置,一个是获取:

c.Ctx.SetCookie(key,value,有效时长...)

c.Ctx.GetCookie(key)

5.1 设置cookie

 c.Ctx.SetCookie("username",u.Username,100,"/")

SetCookie的第三个参数是时间,单位是秒 ,如果不设置时间,Cookie只在本次回话有效,默认存活时间为3600秒。第四个参数是Cookie设置路径。

5.2 获取Cookie

func (c *TestLoginController) Login() {
    //获取cookie
    username := c.Ctx.GetCookie("username")
    password := c.Ctx.GetCookie("password")

    fmt.Println("Login()方法中:username:",username,",password:",password)
    //验证用户名和密码:
    if username != "" {
        c.Ctx.WriteString("Username:" + username + ",Password:" + password)
    } else {

        c.Ctx.WriteString(`
用户名:
密   码:
`
) } }

然后我们输入用户名和密码,点击按钮进行提交,接下类,我们再次重新输入地址:http://127.0.0.1:9527/testlogin。发现还是登录成功页面,因为经过get请求,执行Login()方法时,可以获取到cookie,会直接显示登录信息,而无需用户再次登录了

6. MongoDB

  1. MongoDB是非关系型数据库当中最像关系型数据库的,所以我们通过它与关系型数据库的对比,来了解下它的概念。
SQL概念 MongoDB概念 解释说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
primary key primary key 主键,MongoDB自动将_id字段设置为主键
// 查看当前数据库用户
	show users
//登录认证
	db.auth("admin", "123456")
//创建用户密码
	db.createUser({
    user:"admin",    // 用户名
    pwd:"123456",    // 密码
    roles:["root"]   // 角色
}) 
//修改用户密码
    db.updateUser( "admin", {
    pwd: "abc666"
})
//删除用户
	db.dropUser("admin")  // admin 是要删除的用户名
//默认端口和绑定地址
    port: 27017
    bindIp: 127.0.0.1    
//本机数据库存储地址目录
    dbPath: D:\Program Files (x86)\DB\data
//数据库日志目录
    path:  D:\Program Files (x86)\DB\log\mongod.log    

6.1 创建表和插入数据

sql创建表:

create table people (
    id mediumint not null
        auto_increment,
    user_id varchar(30),
    age number,
    status char(1),
    primary key (id)
)

mongodb不用创建表,如果你插入的数据指定的文档没有,那么会自动创建一个相应的文档,并保存。但是也可以显示的创建一个文档然后在向里面插入数据的。

db.people.insertOne( {
    user_id: "abc123",
    age: 55,
    status: "A"
 } )

sql插入数据

insert into people(user_id,age,status) values ("bcd001",45,"a")

6.2 查询数据

mysql:

select * from table

mongodb

db.table.find()
返回指定字符串
select id,user_id,status from people
db.people.find(
    {},
    { user_id: 1, status: 1 }
)

第一个 {},不能去掉,表示筛选条件,例如sql中的where。后面这个大括号中的字段表示是否显示,如果为 1显示,0不显示。但是 _id默认是显示的

条件查询
SELECT *
FROM people
WHERE status = "A"
db.people.find(
    { status: "A" }
)
SELECT user_id, status
FROM people where status="A"
db.people.find(
    { status:"A" },
    { user_id: 1, status: 1, _id: 0 }
)

status!=“A”

SELECT *
FROM people
WHERE status != "A"
db.people.find(
    { status: { $ne: "A" } }
)

status = “A” or age = 50 返回所有字段

SELECT *
FROM people
WHERE status = "A"
OR age = 50
db.people.find(
    { $or: [ { status: "A" } , { age: 50 } ] }
)

age >25 and age<25

SELECT *
FROM people
WHERE age > 25
AND   age <= 50
db.people.find(
   { age: { $gt: 25, $lte: 50 } }
)
模糊查询
SELECT *
FROM people
WHERE user_id like "%bc%"
db.people.find( { user_id: /bc/ } )
db.people.find( { user_id: { $regex: /bc/ } } )
SELECT *
FROM people
WHERE user_id like "bc%"
db.people.find( { user_id: /^bc/ } )
或者
db.people.find( { user_id: { $regex: /^bc/ } } )

根据user_id升序排序,并且status = “A”

SELECT *
FROM people
WHERE status = "A"
ORDER BY user_id ASC
db.people.find( { status: "A" } ).sort( { user_id: 1 } )

排序的时候,sort()方法是在 find()方法之外了。*最后面这个1表示升序排序,-1表示降序排序*。

获取5到10条数据
SELECT *
FROM people
LIMIT 5,10
db.people.find().limit(5).skip(10)

6.3 MongoDB的增删改查和语句块操作

1. 增加
db.users.save({name: ‘zhangsan’, age: 25, sex: true});

添加的数据的数据列,没有固定,根据添加的数据为准

2. 修改
db.users.update({age: 25}, {$set: {name: 'changeName'}}, false, true);

相当于:update users set name = ‘changeName’ where age = 25;

db.users.update({name: 'Lisi'}, {$inc: {age: 50}, $set: {name: 'hoho'}}, false, true);

​ update set name =“hoho”,age=age+50 from users where name=“lisi”

3. 删除
db.users.remove({age: 132});
4. 查询修改删除
db.users.findAndModify({
   query:{age:{$gte:25}},
   sort:{age:-1},                    
   update:{$set:{name:"lisi"},$inc:{age:2},
   remove: true
});

查询users里面年龄大于25的人数进行降序排序,把他们的名字修改为lisi并且年龄加上2岁

参数 详情 默认值
query 查询过滤条件 {}
sort 如果多个文档符合查询过滤条件,将以该参数指定的排列方式选择出排在首位的对象,该对象将被操作 {}
remove 若为true,被选中对象将在返回前被删除 N/A
update 一个修改器对象 N/A
new 若为true,将返回修改后的对象而不是原始对象。在删除操作中,该参数被忽略。 false
fields all
upsert 创建新对象若查询结果为空。 false
5. 语句块操作
5.1 Hello world
printf("Hello world")

这种写法调用了print函数,和直接写入”Hello World!”的效果是一样的;

5.2 将对象转换为json
tojson(new Object("a"))
5.3 循环添加数据
for(int i=0;i<30;i++){
db.users.save({name:"u_" + i,age:22 + i,sex: i % 2});
};
5.4 forEach迭代循环
db.users.find().forEach(printjson);

5.5 将find游标转换为数组

var cursor = db.users.find();
cursor[4];

取得下标索引为4的那条数据
既然可以当做数组处理,那么就可以获得它的长度:cursor.length();或者cursor.count();
那样我们也可以用循环显示数据

for(int i=0;i<cursor.length();i++){
printjson(cursor[i]);
};
5.6 排除单列
db.users.find({},{userid:false}}.forEach(printjson)

排除非主键的userid

111

你可能感兴趣的:(Beego,数据库)