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. k8s 容器的生命周期钩子

    钩子有两个一个容器起之前定义一个动作PostStart,容器关闭之前定义一个动作PreStop 动作可以是一个命令或http请求 示例 spec: containers: - lifecycle: p ...

  3. 2019.03.23 Cookie

    Cookie  曲奇饼干  哈哈哈.通俗的将,应该是发票. 因为http是无状态操作 当你访问服务器之后,应该会给你响应发票Cookie记录你访问了什么东西 便于下次再来查找吧,Cookie有时间的限 ...

  4. shell实现SSH自动登陆【转】

    前言 公司开发使用docker,每次登陆自己开发机总要输入 ssh user_name@ip_string,然后再确认输入password,手快了还经常会输错.作为一个懒人,肯定要找一个取巧的方式,查 ...

  5. Java Selenium - 处理页面弹出窗

    1. 得到当前窗口句柄 2. 得到所有窗口句柄 3. 循环找到目标窗口 String currentWindow = driver.getWindowHandle(); Set<String&g ...

  6. Django Form(表单)

    前台用 get 或 post 方法向后台提交一些数据. GET方法: html示例(保存在templates文件夹中): <!DOCTYPE html> <html> < ...

  7. MVC 中url-pattern配置为"/"和"/*"的区别

    首先大家都知道"/*"可以匹配所有url,包括带扩展名的,一般只用在过滤器上. 而"/"很多人理解成不能拦截带扩展名的,这种理解是错误的!它其实也能拦截“.js ...

  8. Cacti的使用

    前期准备 SNMP的安装,控制机和被控机,以及被控机的配置 1.SNMP的安装参考:http://www.cnblogs.com/smallcoderhujin/p/3785731.html 2.被控 ...

  9. Sql Server参数化查询之where in和like实现详解 [转]

    文章导读 拼SQL实现where in查询 使用CHARINDEX或like实现where in 参数化 使用exec动态执行SQl实现where in 参数化 为每一个参数生成一个参数实现where ...

  10. Yii2 Restful api创建