Golang原生sql操作Mysql数据库增删改查
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",)
}
}
说明:
数据库查询的一般步骤如下:
- 调用 db.Query 执行 SQL 语句, 此方法会返回一个 Rows 作为查询的结果
- 通过 rows.Next() 迭代查询数据.
- 通过 rows.Scan() 读取每一行的值
- 调用 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数据库增删改查的更多相关文章
- python操作mysql数据库增删改查的dbutils实例
python操作mysql数据库增删改查的dbutils实例 # 数据库配置文件 # cat gconf.py #encoding=utf-8 import json # json里面的字典不能用单引 ...
- Asp.Net操作MySql数据库增删改查
Asp.Net操作MySql数据库增删改查,话不多说直接步入正题.git源码地址:https://git.oschina.net/gxiaopan/NetMySql.git 1.安装MySQL数据库 ...
- python2.7入门---操作mysql数据库增删改查
Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口.Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库: G ...
- python3操作mysql数据库增删改查
#!/usr/bin/python3 import pymysql import types db=pymysql.connect("localhost","root&q ...
- MySQL数据库(增删改查语句)
MySQL数据库(增删改查语句)一.登录数据库:----> mysql -uroot -proot;(对应用户名和密码)二.SQL语句: 数据定义语言DDL 用来定义数据库.表.列,关 ...
- Java连接MySQL数据库增删改查通用方法
版权声明:本文为博主原创文章,未经博主允许不得转载. Java连接MySQL数据库增删改查通用方法 运行环境:eclipse+MySQL 以前我们Java连接MySQL数据库都是一个数据库写一个类,类 ...
- Python实现mysql数据库增删改查
利用python操作mysql数据库用法简单,环境配置容易,本文将实现对库增.删.改.查的简易封装! 1. 环境配置 安装第三方包 ,导入模块 mysql.connector pip inst ...
- jsp-2 简单的servlet连接mysql数据库 增删改查
连接mysql数据库的操作 有增删改查 用的包有 commons-lang3-3.5 mysql-connector-java-5.1.40-bin 但是实际上也就是 数据查询和数据处理两种 所以对数 ...
- 安卓版php服务器的mysql数据库增删改查简单案例
界面: index.php文件: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...
随机推荐
- Python几种数据结构内置方法的时间复杂度
参考:https://blog.csdn.net/baoli1008/article/details/48059623 注:下文中,’n’代表容器中元素的数量,’k’代表参数的值,或者参数的数量. 1 ...
- 4个项目带你学习ThinkPHP
ThinkPHP是一个快速.兼容而且简单的轻量级国产PHP开发框架,这里分享4个项目教程,带你掌握ThinkPHP,并能够在实践开发中应用. ThinkPHP框架实践 这个教程从ThinkPHP的入门 ...
- git stash 用法总结和注意点
常用git stash命令: (1)git stash save "save message" : 执行存储时,添加备注,方便查找,只有git stash 也要可以的,但查找时不 ...
- gdb强制生成core文件
如何为自己的进程产生core 文件,又不想退出这个进程? 系统只在程序崩溃退出时自动产生core file. 有的人像自己处理异常信号,然后自己产生一个core file,然后继续运行.那该怎么办呢? ...
- JAVA编程思想学习笔记5-chap13-15-斗之气5段
1.String对象不可变,一旦发生字符变换或者变长度,一定是新建了一个String private final char value[]; 2.字符串+与+=:唯二操作符重载 "aaa&q ...
- HDU 2254 奥运(矩阵+二分等比求和)
奥运 [题目链接]奥运 [题目类型]矩阵+二分等比求和 &题解: 首先离散化城市,之后就是矩阵快速幂了,但让求的是A^(t1)+A^(t1+1)+...+A^(t2),我先想的是打表,但时间真 ...
- winform下picturebox控件显示图片问题
viewData_pictureBox.SizeMode=PictureBoxSizeMode.StretchImage;图片会自动按照比例缩放来完全显示在你的PictureBox中.
- EL语言表达式 (三)【EL中的算术运算以及判断EL对象是否为空】
一.EL中的算术运算 EL和其他语言一样,同样也提供了基本的算术运算(加.减.乘.除和取余),如下图. 运算符 功能 示例 结果 + 加 ${19+1} 20 - 减 ${66-30} 36 * 乘 ...
- Android Studio -- 关联源码
1,昨天刚把SDK升级到25,然后准备开始 新的一年码代码,结果发现查看源码的时候出现了一堆的“ throw new RuntimeException("Stub!");” 网上搜 ...
- JSP—简介
BS/CS的区别? CS模式: client:客户端:存放操作界面的图片样式本地数据和缓存等 server:服务端:保存核心数据 请求响应模式:收到请求后,服务器只需要返回核心的数据 优缺点:需要安装 ...