Golang要操作mysql数据库,首先需要在当期系统配置GOPATH,因为需要使用go get命令把驱动包下载到GOPATH下使用。

首先配置好你的GOPATH,执行以下命令,下载安装mysql驱动,下载完成之后会在GOPATH下的src/github.com目录下

//路由文件
package routers import (
"github.com/astaxie/beego"
"mypro/controllers"
) func init() {
beego.Router("/", &controllers.MainController{})
beego.Router("/collection", &controllers.CollectionController{})
beego.Router("/getmovieinfo/?:id", &controllers.GetMovieInfoController{},"get:Get")
beego.Router("/postmovieinfo", &controllers.GetMovieInfoController{},"post:Post") //post
beego.Router("/editmovieinfo/?:id", &controllers.GetMovieInfoController{},"get:Edit") //post
beego.Router("/editmovieinfo", &controllers.GetMovieInfoController{},"post:EditPost") //post
beego.Router("/deletemovieinfo/?:id", &controllers.GetMovieInfoController{},"get:Delete") //post
beego.Router("/addmovieinfo", &controllers.GetMovieInfoController{},"post:Add") //post
beego.Router("/addmovieinfoview", &controllers.GetMovieInfoController{},"get:AddView") //post
}
//控制器文件

package controllers

import (
"fmt"
"github.com/astaxie/beego"
"mypro/models"
"strings"
) type GetMovieInfoController struct {
beego.Controller
}
type MovieInfo struct {
Id int64
Movie_name string
Movie_director string
}
type JsonpData struct {
Code int
Msg string
} //获取列表数据展示
func (c *GetMovieInfoController) Get() {
ids := []string{"", "", ""}
db := models.ConnectDb();
defer db.Close() idStr := strings.Join(ids, "','")
sqlText := "select id,movie_name,movie_director from movie_info where id in ('%s')"
sqlText = fmt.Sprintf(sqlText, idStr)
rows,err := db.Query(sqlText)
item := MovieInfo{}
list := []MovieInfo{} for rows.Next(){
var mid int64
var movie_name, movie_director string
err = rows.Scan(&mid,&movie_name,&movie_director)
if err != nil {
panic(err.Error())
}
item.Id = mid
item.Movie_name = movie_name
item.Movie_director = movie_director
list = append(list,item)
}
c.Data["List"] = list
c.Data["Title"] = "电影列表"
c.TplName = "get.tpl"
} //编辑查看数据地址
func (c *GetMovieInfoController) Edit() { movie_id := c.GetString(":id")
db := models.ConnectDb();
defer db.Close()
var Info MovieInfo
err := db.QueryRow("select id,movie_name,movie_director from movie_info where id = ?",movie_id).Scan(&Info.Id, &Info.Movie_name, &Info.Movie_director)
if err != nil {
panic(err.Error())
}
c.Data["info"] = Info
c.TplName = "Edit.tpl"
} //编辑提交地址
func (c *GetMovieInfoController ) EditPost() {
Movie_name:=c.GetString("name")
Movie_director:=c.GetString("director")
Id:=c.GetString("id")
db := models.ConnectDb();
defer db.Close()
res,_ := db.Exec("update movie_info set movie_name =?,movie_director = ? where id = ?",Movie_name,Movie_director,Id)
num, _ := res.RowsAffected() //影响行数
if num > {
c.Redirect("/editmovieinfo/"+Id,)
} else {
c.Redirect("http://www.baidu.com",)
}
} //删除动作提交
func (c *GetMovieInfoController ) Delete() {
Id:=c.GetString(":id")
db := models.ConnectDb();
defer db.Close()
res,err := db.Exec("delete from movie_info where id = ?",Id)
if err != nil {
panic(err.Error())
}
num, _ := res.RowsAffected() //影响行数
if num > {
c.Redirect("/getmovieinfo",)
} else {
c.Redirect("http://www.baidu.com",)
}
} //增加视图
func (c *GetMovieInfoController ) AddView() { c.TplName="add.tpl"
} //增加提交操作地址
func (c *GetMovieInfoController ) Add() {
Movie_name:=c.GetString("name")
Movie_director:=c.GetString("director")
db := models.ConnectDb();
defer db.Close()
res,err := db.Exec("insert into movie_info ( movie_name ,movie_director) values (?,?)",Movie_name,Movie_director)
if err != nil {
panic(err.Error())
}
num, _ := res.RowsAffected() //影响行数
if num > {
c.Redirect("/getmovieinfo",)
} else {
c.Redirect("http://www.baidu.com",)
}
}

说明:

数据库查询的一般步骤如下:

  1. 调用 db.Query 执行 SQL 语句, 此方法会返回一个 Rows 作为查询的结果
  2. 通过 rows.Next() 迭代查询数据.
  3. 通过 rows.Scan() 读取每一行的值
  4. 调用 db.Close() 关闭查询
  • rows.Scan 参数的顺序很重要, 需要和查询的结果的column对应. 例如 “SELECT * From user where age >=20 AND age < 30” 查询的行的 column 顺序是 “id, name, age” 和插入操作顺序相同, 因此 rows.Scan 也需要按照此顺序 rows.Scan(&id, &name, &age), 不然会造成数据读取的错位.
  • 因为golang是强类型语言,所以查询数据时先定义数据类型,但是查询数据库中的数据存在三种可能:存在值,存在零值,未赋值NULL 三种状态, 因为可以将待查询的数据类型定义为sql.Nullxxx类型,可以通过判断Valid值来判断查询到的值是否为赋值状态还是未赋值NULL状态.
  • 每次db.Query操作后, 都建议调用rows.Close(). 因为 db.Query() 会从数据库连接池中获取一个连接, 这个底层连接在结果集(rows)未关闭前会被标记为处于繁忙状态。当遍历读到最后一条记录时,会发生一个内部EOF错误,自动调用rows.Close(),但如果提前退出循环,rows不会关闭,连接不会回到连接池中,连接也不会关闭, 则此连接会一直被占用. 因此通常我们使用 defer rows.Close() 来确保数据库连接可以正确放回到连接池中; 不过阅读源码发现rows.Close()操作是幂等操作,即一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同, 所以即便对已关闭的rows再执行close()也没关系.

Golang原生sql操作Mysql数据库增删改查的更多相关文章

  1. python操作mysql数据库增删改查的dbutils实例

    python操作mysql数据库增删改查的dbutils实例 # 数据库配置文件 # cat gconf.py #encoding=utf-8 import json # json里面的字典不能用单引 ...

  2. Asp.Net操作MySql数据库增删改查

    Asp.Net操作MySql数据库增删改查,话不多说直接步入正题.git源码地址:https://git.oschina.net/gxiaopan/NetMySql.git  1.安装MySQL数据库 ...

  3. python2.7入门---操作mysql数据库增删改查

    Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口.Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库: G ...

  4. python3操作mysql数据库增删改查

    #!/usr/bin/python3 import pymysql import types db=pymysql.connect("localhost","root&q ...

  5. MySQL数据库(增删改查语句)

    MySQL数据库(增删改查语句)一.登录数据库:---->  mysql -uroot -proot;(对应用户名和密码)二.SQL语句:    数据定义语言DDL  用来定义数据库.表.列,关 ...

  6. Java连接MySQL数据库增删改查通用方法

    版权声明:本文为博主原创文章,未经博主允许不得转载. Java连接MySQL数据库增删改查通用方法 运行环境:eclipse+MySQL 以前我们Java连接MySQL数据库都是一个数据库写一个类,类 ...

  7. Python实现mysql数据库增删改查

    利用python操作mysql数据库用法简单,环境配置容易,本文将实现对库增.删.改.查的简易封装!   1. 环境配置 安装第三方包  ,导入模块 mysql.connector  pip inst ...

  8. jsp-2 简单的servlet连接mysql数据库 增删改查

    连接mysql数据库的操作 有增删改查 用的包有 commons-lang3-3.5 mysql-connector-java-5.1.40-bin 但是实际上也就是 数据查询和数据处理两种 所以对数 ...

  9. 安卓版php服务器的mysql数据库增删改查简单案例

    界面: index.php文件: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...

随机推荐

  1. python 类组合

    场景:有一辆车违章需要通知到车主 定义两个类车辆类和通知类,车辆类和通知类并没有共同点,但是要通知车主这两个类就有了关联,这时候可以把这两个类组合在一起 #!/usr/bin/python3 # -* ...

  2. 阿里云RDS备份在本地mysql快速还原

    本地准备: ##安装和RDS相同的mysql版本,拿mysql5.6为例 http://www.cnblogs.com/37yan/p/7513605.html ##安装Xtrabackup 包 cd ...

  3. [Java] public, private, final and basic rules for naming.

    1. Access: public, private, protected public: Any other class can access a public field or method. ( ...

  4. Hinge Loss、交叉熵损失、平方损失、指数损失、对数损失、0-1损失、绝对值损失

    损失函数(Loss function)是用来估量你模型的预测值 f(x) 与真实值 Y 的不一致程度,它是一个非负实值函数,通常用 L(Y,f(x)) 来表示.损失函数越小,模型的鲁棒性就越好. 损失 ...

  5. iOS UI布局-VFL语言

    什么是VFL语言 VFL(Visual Format Language),“可视化格式语言”. VFL是苹果公司为了简化autolayout的编码而推出的抽象语言. 语法说明 H:[cancelBut ...

  6. VirtualBox下扩容vdi文件

    VirtualBox下扩容vdi文件 版本:VirtualBox 5.0.14 之前VirtualBox创建的虚拟机的vdi文件过小,无法满足新的实验需求,扩容vdi文件的方法如下: 比如我这里将RH ...

  7. vue2.0leaflet

    github源码在此,记得点星:https://github.com/brandonxiang/vueleaflet 参考文档:https://korigan.github.io/Vue2Leafle ...

  8. 在PHP5.3以上版本运行ecshop出现的问题及解决方案

     ecshop 问题一:商城首页报错 Strict Standards: Only variables should be passed by reference in D:\wamp\ecshop\ ...

  9. react native 初识生命周期

    关于生命周期这块,我是看到慕课堂的一个视频,觉得将的很好,引入很容易理解,地址是:https://www.imooc.com/video/14288  如果你们想了解一下,也可以去看看 RN 组件的生 ...

  10. 从0开始搭建vue+webpack脚手架(一)

    基于多数情况下都是使用vue-cli初始化项目, 却始终未去了解其原理.从零开始搭建,可以让自己更深层次的理解框架. 首先从最基本的npm 开始, 至于安装npm 和 node就不用再赘述了,那是前端 ...