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 ...
随机推荐
- 关于SimpleDateFormat时间转换总是显示1970年的问题
今天遇到了一个奇怪的问题, long time = 1488606363; Date date = new Date(time); java.text.SimpleDateFormat sDateFo ...
- 【UML】-NO.42.EBook.5.UML.1.002-【UML 大战需求分析】- 活动图 (Activity Diagram)
1.0.0 Summary Tittle:[UML]-NO.42.EBook.1.UML.1.002-[UML 大战需求分析]- 活动图 Style:DesignPattern Series:Desi ...
- Spring MVC定时服务
spring-mvc-config.xml <context:component-scan base-package="com.bf" ></context:co ...
- word2vec 评测 window_different
This is a test for word2vecWed Nov 07 16:04:39 2018dir of model1: ./model/window3_ min_count2_worker ...
- 转: Java LinkedList基本用法
LinkedList类是双向列表,列表中的每个节点都包含了对前一个和后一个元素的引用.LinkedList的构造函数如下1. public LinkedList(): ——生成空的链表2. publ ...
- cocos2dx JS 游戏切到后台再进入游戏的处理
由于Cocos引擎中,游戏切入后台后定时器后停掉会让某个Animation动作停止. 导致当重新进入游戏时,看到的不是你想要的画面.或者定时器倒计时的时间对不上等问题. cc.game.EVENT_H ...
- Struts2第三天
## Struts2第三天 ## ---------- **课程回顾:Struts2框架的第二天** 1. Servlet的API * ActionContext对象 * ServletActionC ...
- scrapy yield
生成器 一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环 ...
- 80x86的内存寻址机制
80x86的内存寻址机制 80386处理器的工作模式: 模式. 模式之间可以相互转换,而模式之间不可以相互转换. DOS系统运行于实模式下,Windows系统运行与保护模式下. 实模式: 80386处 ...
- mysql主从配置,读写分离
Mysql主从配置,实现读写分离 大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库 ...