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. [LeetCode] 455. Assign Cookies_Easy tag: Sort

    Assume you are an awesome parent and want to give your children some cookies. But, you should give e ...

  2. js使用的一些实用技巧

    1.jquery中页面定时调用ajax方法 function SetContinueSend(param1,param2, func){ func.call(null,param1,param2) } ...

  3. NPOI设置单元格格式

    转自:http://www.cr173.com/html/18143_2.html //创建一个常用的xls文件 private void button3_Click(object sender, E ...

  4. iOS 新浪微博-5.3 首页微博列表_集成图片浏览器

    实际上,我们可以使用李明杰在教程里集成的MJPhotoBrowser,地址: http://code4app.com/ios/快速集成图片浏览器/525e06116803fa7b0a000001 使用 ...

  5. jquery实现记住用户名和密码

    这里我们选择的方法是cookie的方式去记录 首先我们写将用户名和密码写到cookie的js代码 //保存到cookie function save_cookies(){ if($("#re ...

  6. whu 643 Soul Artist(二维BIT 区间更新,单点查询)

    Soul Artis [题目链接]Soul Artis [题目类型]二维BIT &题解: 二维区间更新和一维相比,要容斥一下,更新一块区间就是更新4个点. 还有这个我先是写了2*n^2logn ...

  7. python pillow

    https://www.cnblogs.com/morethink/p/8419151.html#%E7%9B%B4%E6%8E%A5%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA ...

  8. [16]Windows内核情景分析 --- 服务管理

    随时可以看到任务管理器中有一个services.exe进程,这个就是系统的服务控制管理进程,简称SCM 这个进程专门用来管理服务(启动.停止.删除.配置等操作) 系统中所有注册的服务都登记在\HKEY ...

  9. GCD(III)

    GCD 线程间的通信 在iOS开发过程中,我们一般在主线程里边进行UI刷新,例如:点击.滚动.拖拽等事件.我们通常把一些耗时的操作放在其他线程,比如说图片下载.文件上传等耗时操作.而当我们有时候在其他 ...

  10. Web API 跨域请求

    分布式技术在项目中会频繁用到,以前接触过WebService(可跨平台).WCF(功能强大,配置繁琐),    最近由于上层业务调整,将原来的MVC项目一分为三,将数据层提取出来,用API去访问.然后 ...