golang mysql封装_自己封装的golang 操作数据库方法

这个是我用Go写的第一个东东,可能还存在些BUG没有测试到。这里主要是提供一个参考。各位可以改写成自己的风格。

在命令行下输入如下两条命令,进行安装

go get github.com/male110/SimpleDb

go install github.com/male110/SimpleDb

Go语言的数据库操作,只能用Rows.Scan来一次性读取所有列。感觉很不习惯,我还是习惯按照列名来一列列的取数据。所以我自己封装了一个数据结构MyRows,MyRows实现了一个函数,GetValue(name string, value interface{})可以按列名来取数据。如下所示:

err = rows.GetValue("IsBoy", &isBoy)

if err != nil {

fmt.Println(err)

return

}

为了操作方便,还定义了其它的结构体,如MyDb,其Query函数可以直接返回 MyRows。NewDb用来创建MyDb结构,其参数与sql.Open一至,怎么传取决于你所使用的驱动程序。

db, err := SimpleDb.NewDb("mysql", "root:123@tcp(127.0.0.1:3306)/test?charset=utf8")

if err != nil {

fmt.Println("打开SQL时出错:", err.Error())

return

}

var rows *SimpleDb.MyRows

//从数据库中取数据

rows, err = db.Query("select * from person")

if err != nil {

fmt.Println(err)

return

}

//显示数据

for rows.Next() {

var id, age int

var name string

var isBoy bool

//按字段名取数据,也可以用rows.Scan(&id,&name,&age),来取

rows.GetValue("id", &id)

rows.GetValue("name", &name)

rows.GetValue("age", &age)

//可以根据返回值,判断是否成功

err = rows.GetValue("IsBoy", &isBoy)

if err != nil {

fmt.Println(err)

return

}

fmt.Println(id, "\t", name, "\t", age, "\t", isBoy)

}

同时还时现了一个简单的ORM,实现了最基本的插入数据,修改数据,删除数据。 我一般使用ORM只用这么几个方法,其它的都是写SQL语句。这里只是一个参考,大家可以根据自己的需要,自己习惯,进行修改。改成自己需要的格式。数据结构的定义格式如下:

type Person struct {

/*TableName类型只是用来设置表名。如果结构体名跟表名相同可以省略*/

TableName SimpleDb.TableName "person"

/*name是表名,PK用来设置是否主键,true主键,false非主键*/

Id int `name:"id"PK:"true"Auto:"true"`

Name string "name" //tag里的name表是对应的字段名

Age int "age" //tag里的age表是对应的字段名

IsBoy bool

NotUse string "-" //-不会保存到数据库中

}

上面的说明已经很详细了, SimpleDb.TableName类型的字段,只用来在tag中定义结构体对应的表名,如果没有该字段,认为表名就是结构体名相同。 PK:"true"表示是主键,Auto:"true"表示该字段是自动增长的列,name:"id",来指定该字段对应的数据表中的列名,如不指定认为 跟字段名相同。当只需要指定列名时,可以直接写在tag中,如:"name"、"age"。tag为"-"表示不对应数据表中的任何列。

// 插入数据

p := &Person{Name: "张三丰", Age: 500, IsBoy: true}

db.Insert(p)

//修改数据

db.Update(p)

//删除数据

db.Delete(p)

下面来看一个完整的例子,首先他创表:

CREATE TABLE `person` (

`id` INT(50) NOT NULL AUTO_INCREMENT,

`name` VARCHAR(50) NULL DEFAULT NULL,

`age` INT(50) NULL DEFAULT NULL,

`IsBoy` SMALLINT(10) NULL,

PRIMARY KEY (`id`)

)

COLLATE='utf8_general_ci';

insert into `person` (name,age,IsBoy) values('张三',20,0);

insert into `person` (name,age,IsBoy) values('王五',19,1);

下面是完整的代码

package main

import (

"fmt"

_ "github.com/go-sql-driver/mysql"

"github.com/male110/SimpleDb"

)

type Person struct {

/*TableName类型只是用来设置表名。如果结构体名跟表名相同可以省略*/

TableName SimpleDb.TableName "person"

/*name是表名,PK用来设置是否主键,true主键,false非主键*/

Id int `name:"id"PK:"true"Auto:"true"`

Name string "name" //tag里的name表是对应的字段名

Age int "age" //tag里的age表是对应的字段名

IsBoy bool

NotUse string "-" //-不会保存到数据库中

}

func main() {

db, err := SimpleDb.NewDb("mysql", "root:123@tcp(127.0.0.1:3306)/test?charset=utf8")

if err != nil {

fmt.Println("打开SQL时出错:", err.Error())

return

}

defer db.Close()

p := &Person{Name: "张三丰", Age: 500, IsBoy: true}

//插入一条数据

err = db.Insert(p)

if err != nil {

fmt.Println(err)

return

}

fmt.Println("新插入数据的ID:", p.Id)

var rows *SimpleDb.MyRows

//从数据库中取数据

rows, err = db.Query("select * from person")

if err != nil {

fmt.Println(err)

return

}

//显示数据

for rows.Next() {

var id, age int

var name string

var isBoy bool

//按字段名取数据,也可以用rows.Scan(&id,&name,&age),来取

rows.GetValue("id", &id)

rows.GetValue("name", &name)

rows.GetValue("age", &age)

//可以根据返回值,判断是否成功

err = rows.GetValue("IsBoy", &isBoy)

if err != nil {

fmt.Println(err)

return

}

fmt.Println(id, "\t", name, "\t", age, "\t", isBoy)

}

//输出分割线

fmt.Println("==========割割割割割割割割============")

p.Name = "彭祖"

p.Age = 800

//修改数据

_, err = db.Update(p)

if err != nil {

fmt.Println(err, "xxxx")

return

}

//QueryDataRows返回一个DataRow数组,DataRow中有一map来存放行中的数据

var arrRow []SimpleDb.DataRow

arrRow, err = db.QueryDataRows("select * from person")

if err != nil {

fmt.Println(err, "zzzzz")

return

}

for _, row := range arrRow {

var id, age int

var name string

var isBoy bool

//只能按字段名取数据

row.GetValue("id", &id)

row.GetValue("name", &name)

row.GetValue("age", &age)

//可以根据返回值,判断是否成功

err = rows.GetValue("IsBoy", &isBoy)

if err != nil {

fmt.Println(err)

return

}

fmt.Println(id, "\t", name, "\t", age, isBoy)

}

var p2 Person

p2.Id = p.Id

//根据主键从数据库中取单条数据

err = db.Load(&p2)

if err != nil {

fmt.Println(err)

return

}

fmt.Println(p2)

//根据主键删除一条数据

db.Delete(p2)

}

有疑问加站长微信联系(非本文作者)

5c5fbae790ec0313d6ee17e8b3dd9ba1.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/528275.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql历史数据备份_Mysql存储过程历史表备份

原文:Mysql存储过程历史表备份应用背景SCADA采集系统需要将实时数据存入历史表。问题1:如何更简单的添加历史数据?2.海量历史数据,比如年数据,如何快速筛选 画曲线?利用mysql的事件,每小时存一次采集数据&a…

如何用js给图片重置宽_如何用js给老婆每天发情话

作者: 加百利真胖原文:https://juejin.cn/events/all一、引言最近家里添了小孩,在家带娃陪产了一些天,深刻体会到老婆带孩子的辛苦。工作的时候不能在家陪她,就想着写个程序,每天固定在固定时间给她发一些情话,好让她在…

世界手机号码格式_世界上手机号码最长的国家是中国,最短的是哪个国家?

现在手机普及率非常之高,基本上人手至少一个手机,那么哪个国家的手机号码最长呢?其实世界上最长的电话号码,是11位数的中国手机号码。为什么手机号码是11位呢?1、号码格式决定我们的手机号可以分为三段,都有…

dockers log查询dockers的文件_Tomcat PUT方法任意文件上传

漏洞背景:tomcat(7.0.0-7.8.1)服务器,开启了HTTP PUT请求方法,web.xml文件中的readonly值设置未false漏洞环境:使用vulhub环境,直接dockers安装安装成功:安装vulhub详见:https://vulhub.org/#/index/漏洞利…

vue替换全部符合’字符串_技术成长日记-Vim实用技巧-4.7查找替换

1. 普通查找/ 向下查找? 向上查找n 查找下一个目标字符串N 查找上一个目标字符串q/ 回溯查找历史,输入该命令后会在状态栏上方显示一个查找历史回溯窗口,如图4.1: 图4.1 回溯查找历史可以选择之前执行过的查找,也可以在最后一行回…

bex5 mysql_bex5 库存系统的增删改查等功能对MYSQL数据库的维护操作 Windows Develop 276万源代码下载- www.pudn.com...

文件名称: bex5下载 收藏√ [5 4 3 2 1 ]开发工具: Java文件大小: 99 KB上传时间: 2017-05-18下载次数: 0提 供 者: 张天详细说明:库存系统的增删改查等功能对MYSQL数据库的维护操作- U5E93 u5B58 u7CFB u7EDF文件列表(点击判断是否您需要的文件,如…

excel导入mysql 截断_解决Excel导入数据库时出现的文本截断问题

问题在把Excel导入到数据库中时,发生文本截断问题:即导入的数据每行只有一部分,原始的Excel数据为:忽略错误导入SQLServer2008过程中,如果源数据和目标数据类型不匹配会导入失败,所以导入数据时会忽略错误&…

mysql表添加完整性约束_SQL语句——完整性约束

1.MySQL支持的完整性约束a.主键约束特点:唯一且非空主键可以由一个字段组成,也可以由多个字段组成如果主键由一个字段组成,既可以添加到列级,也可以添加到表级。如果主键由多个字段组成,则只能添加到表级。(1)在字段的…

通信线路工程验收规范 gb51171-2016_老杨一建通信学堂通信线路工程施工技术

引言:本章节以通信线路工程施工建设为主题,涵盖通信光(电)缆施工通用技术、架空、直埋、管道还有综合布线工程施工技术,深入浅出介绍通信线路工程建设中各环节的工作内容和涉及的相关规范。知识归纳卡名 称:1L412050 章 节…

python制作测试报告_使用 python 生成 extent report 测试报告

背景一直使用 HTMLTestRunner 生成 app 自动化的测试报告内容,虽然加了截图的展示,还是感觉报告不够好看。allure 报告内容可以,但是要以 pytest 管理测试 case,且 pytest 会执行所有以 test_命名的 case,测试结果只有…

twisted mysql_在Twisted下用MySQLadbapi获取自增id

D jango的ORM有一个很便捷的功能,其实也应该说是一个很基本的功能吧。就是在对一个model调用 save() 插入到数据库后,会将创建的D jango的ORM有一个很便捷的功能,其实也应该说是一个很基本的功能吧。就是在对一个model调用 save() 插入到数据…

java客户端_Java常用的Http client客户端

Http Client应用场景:Http协议是最重要的网络协议之一,目前移动端的开发、javaweb前后端分离架构,使越来越多的java应用使用http协议访问资源。Http client 大多数场景使用在多个服务之间相互调用rest api,特别是现在微服务架构的…

android jni 调用java对象_Android NDK开发之Jni调用Java对象

本地代码中使用Java对象通过使用合适的JNI函数,你可以创建Java对象,get、set 静态(static)和 实例(instance)的域,调用静态(static)和实例(instance)函数。JNI通过ID识别域和方法,一个域或方法的ID是任何处理域和方法的函数的必须…

docker 容器端口访问不到_docker容器无法访问宿主机端口的解决

最近在工作时遇到一个问题,docker容器无法访问宿主机的redis,telent6379端口不通。 经排查发现,该服务器启用了防火墙,防火墙把6379的端口的访问授权给docker0网卡访问即可。 操作如下: firewall-cmd --permanent --zone=trusted --change-interface=docker0 firewall-cmd…

java class isassignablefrom_Java之——Class的isAssignableFrom方法

转载请注明出处 https://blog.csdn.net/l1028386804/article/details/80508540Class的isAssignableFrom方法定义如下public native boolean isAssignableFrom(Class ? cls);由方法签名可见是一个本地方法 即C代码编写的。以下是JDK中的注释Determines if the class or interfa…

java中堆栈的基本操作_玩儿转队列和栈的基本操作及其应用:Java 版

队列的基本操作队列入队出队实现队列是种先进先出的数据结构。队列的基本操作主要是入队和出队。数据从队尾进入队列,从队首出队列。下面来写一个简单的队列:public class MyQueue {private List data;private int pointer;public MyQueue() {data new ArrayList&l…

java界面编辑教程_java程序设计基础教程第六章图形用户界面编辑.docx

java程序设计基础教程第六章图形用户界面编辑.docx还剩27页未读,继续阅读下载文档到电脑,马上远离加班熬夜!亲,很抱歉,此页已超出免费预览范围啦!如果喜欢就下载吧,价低环保!内容要点…

c盘java文件误删_java获取C盘下的隐藏目录文件名称

题记—— 执剑天涯,从你的点滴积累开始,所及之处,必精益求精,即是折腾每一天。网易云课堂在Java中, File类用来将文件或者文件夹封装成对象,方便对文件与文件夹的属性信息进行操作。File对象可以作为参数传…

对java这门课程的认识_关于java课程的总结

前言本次博客主要内容为此次三次作业的总结,整门java课程学习的总结,以及在此次java课程中的收获,和对课程的意见。作业过程总结第一次作业主要考察的是对程序的可扩展性,实现开闭原则非常重要,因为程序随着时间&#…

linux php和java环境变量配置_Linux下配置Java环境变量

一般来说,我们都会把Java安装到 /usr/local 目录 或者 /opt 目录下。这里假设java安装包已解压在了 /opt下,具体目录为:/opt/java8/java1.8.0_45目录(注意:如果是生产环境中,一定要root用户来安装配置)。下面我们来配置…