golang数据库操作相应内容--推荐【比较全】

Go为开发数据库驱动定义了一些标准接口,开发者可以根据定义的接口来开发相应的数据库驱动,只要是按照标准接口开发的代码, 以后需要迁移数据库时,不需要任何修改。

一、database/sql接口

1.1sql.Register

这个存在于database/sql的函数是用来注册数据库驱动的,当第三方开发者开发数据库驱动时,都会实现init函数,在init里面会调用这个Register(name string, driver driver.Driver)完成本驱动的注册。


//https://github.com/mattn/go-sqlite3驱动
func init() {sql.Register("sqlite3", &SQLiteDriver{})
}
//https://github.com/mikespook/mymysql驱动
// Driver automatically registered in database/sql
var d = Driver{proto: "tcp", raddr: "127.0.0.1:3306"}
func init() {Register("SET NAMES utf8")sql.Register("mymysql", &d)
}

1.2driver.Driver

Driver是一个数据库驱动的接口,他定义了一个method: Open(name string),这个方法返回一个数据库的Conn接口。


type Driver interface {Open(name string) (Conn, error)
}

1.3driver.Conn


type Conn interface {Prepare(query string) (Stmt, error)Close() errorBegin() (Tx, error)
}

1.4driver.Stmt


type Stmt interface {Close() errorNumInput() intExec(args []Value) (Result, error)Query(args []Value) (Rows, error)
}

1.5driver.Tx


type Tx interface {Commit() errorRollback() error
}

1.6driver.Result


type Result interface {LastInsertId() (int64, error)RowsAffected() (int64, error)
}

1.7driver.Rows


type Rows interface {Columns() []stringClose() errorNext(dest []Value) error
}

二、sqlite3

2.1sqlite3创建数据库库lab3.db

2.2创建数据库表


CREATE TABLE `userinfo` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT,`username` VARCHAR(64) NULL,`departname` VARCHAR(64) NULL,`created` DATE NULL
);//这个可以先不创建
CREATE TABLE `userdetail` (`uid` INT(10) NULL,`intro` TEXT NULL,`profile` TEXT NULL,PRIMARY KEY (`uid`)
);

 2.3sqlite3数据库访问工具(开源)

Downloads - DB Browser for SQLite

https://sqlitebrowser.org/dl/

 

 2.4代码 增删改查

使用的时候,先把删除的注释,然后看结果

package mainimport ("database/sql""fmt"_ "github.com/mattn/go-sqlite3""time"
)func checkErr(err error) {if err != nil {panic(err)}
}func main() {db, err := sql.Open("sqlite3", "./lab3.db")checkErr(err)//插入数据stmt, err := db.Prepare("INSERT INTO userinfo(username, departname, created) values(?,?,?)")checkErr(err)//上面对应的参数res, err := stmt.Exec("astaxie", "研发部门", "2023-1-09")res2, err2 := stmt.Exec("root", "测试部", "2023-1-09")checkErr(err)checkErr(err2)id, err := res.LastInsertId()id2, err2 := res2.LastInsertId()checkErr(err)checkErr(err2)fmt.Println(id)fmt.Println(id2)//更新数据stmt, err = db.Prepare("update userinfo set username=? where uid=?")checkErr(err)res, err = stmt.Exec("newastaxie", id)checkErr(err)affect, err := res.RowsAffected()checkErr(err)fmt.Println(affect)//查询数据rows, err := db.Query("SELECT * FROM userinfo")checkErr(err)for rows.Next() {var uid intvar username stringvar department stringvar created time.Timeerr = rows.Scan(&uid, &username, &department, &created)checkErr(err)fmt.Println("===========================")fmt.Println(uid)fmt.Println(username)fmt.Println(department)fmt.Println(created)}//删除数据stmt, err = db.Prepare("delete from userinfo where uid=?")checkErr(err)res, err = stmt.Exec(id)checkErr(err)affect, err = res.RowsAffected()checkErr(err)fmt.Println(affect)db.Close()
}

2.5验证结果,先把删除的代码注释,查看效果


三、mysql的使用

3.1测试环境的准备,用这个模拟mysql

 

 3.2登录mysql工具navicat

 3.3创建表,跟上面的sqlite3一样


CREATE TABLE `userinfo` (`uid` INT(10) NOT NULL AUTO_INCREMENT,`username` VARCHAR(64) NULL DEFAULT NULL,`departname` VARCHAR(64) NULL DEFAULT NULL,`created` DATE NULL DEFAULT NULL,PRIMARY KEY (`uid`)
);CREATE TABLE `userdetail` (`uid` INT(10) NOT NULL DEFAULT '0',`intro` TEXT NULL,`profile` TEXT NULL,PRIMARY KEY (`uid`)
)

 创建表成功

3.4代码与sqlite3基本一样,还真有个别地方不一样

package mainimport ("database/sql""fmt"//"time"_ "github.com/go-sql-driver/mysql"
)func checkErr(err error) {if err != nil {panic(err)}
}func main() {db, err := sql.Open("mysql", "root:root123456@/mytest?charset=utf8")checkErr(err)//插入数据stmt, err := db.Prepare("INSERT userinfo SET username=?,departname=?,created=?")checkErr(err)res, err := stmt.Exec("tom", "研发部门", "2023-1-09")checkErr(err)id, err := res.LastInsertId()checkErr(err)fmt.Println(id)//更新数据stmt, err = db.Prepare("update userinfo set username=? where uid=?")checkErr(err)res, err = stmt.Exec("astaxieupdate", id)checkErr(err)affect, err := res.RowsAffected()checkErr(err)fmt.Println(affect)//查询数据rows, err := db.Query("SELECT * FROM userinfo")checkErr(err)for rows.Next() {var uid intvar username stringvar department stringvar created stringerr = rows.Scan(&uid, &username, &department, &created)checkErr(err)fmt.Println(uid)fmt.Println(username)fmt.Println(department)fmt.Println(created)}//删除数据stmt, err = db.Prepare("delete from userinfo where uid=?")checkErr(err)res, err = stmt.Exec(id)checkErr(err)affect, err = res.RowsAffected()checkErr(err)fmt.Println(affect)db.Close()
}

3.5验证数据

4.PostgreSQL

4.1数据库下载地址,我下载的zip压缩包

postgresql-14.8-2-windows-x64-binaries.zip

https://www.enterprisedb.com/download-postgresql-binaries

 PostgreSQL 官网下载地址:https://www.postgresql.org/download/

 4.2初始化数据库

命令行移动到解压后目录,初始化数据库:

bin\initdb -D data -U postgres -A password -E utf8 --locale=C -W

bin\initdb -D data -U postgres -A password -E utf8 --locale=C -W

命令行参数意义:

        -D  data                       指定初始化的数据库目录(此处为当前目录的data文件夹)

        -U  postgres                数据库超级用户名(此处为postgres,如果不设置,会用当前windows用户名为账号)

        -A  password              数据库使用密码授权

        -E  utf8                       数据库编码格式

        --locale=C                  数据库簇使用的本地化语言 

        -W                              命令行执行后 输入密码

其他参数的 initdb --help查看
 

4.3启动数据库服务

初始化数据库完成后,指定数据库目录,启动数据库服务器:

bin\pg_ctl -D data start

运行命令行;

bin\pg_ctl -D data start

 4.4验证登录数据库

 

 4.5生成数据库表

 检查表格信息,生成成功

 4.6golang代码【重点--把下面代码中的删除数据的地方先注释】

上面的sqlite3,mysql都是一样的把代码中的删除注释,否则数据库中没有数据

	//删除数据//stmt, err = db.Prepare("delete from userinfo where uid=$1")//checkErr(err)//res, err = stmt.Exec(1)//checkErr(err)//affect, err = res.RowsAffected()//checkErr(err)//fmt.Println(affect)//db.Close()
package mainimport ("database/sql""fmt"_ "github.com/lib/pq"
)func checkErr(err error) {if err != nil {panic(err)}
}func main() {db, err := sql.Open("postgres", "user=postgres password=password dbname=postgres sslmode=disable")checkErr(err)//插入数据stmt, err := db.Prepare("INSERT INTO userinfo(username,departname,created) VALUES($1,$2,$3) RETURNING uid")checkErr(err)res, err := stmt.Exec("astaxie", "研发部门", "2012-12-09")checkErr(err)//pg不支持这个函数,因为他没有类似MySQL的自增ID// id, err := res.LastInsertId()// checkErr(err)// fmt.Println(id)var lastInsertId interr = db.QueryRow("INSERT INTO userinfo(username,departname,created) VALUES($1,$2,$3) returning uid;", "astaxie", "研发部门", "2012-12-09").Scan(&lastInsertId)checkErr(err)fmt.Println("最后插入id =", lastInsertId)//更新数据stmt, err = db.Prepare("update userinfo set username=$1 where uid=$2")checkErr(err)res, err = stmt.Exec("astaxieupdate", 1)checkErr(err)affect, err := res.RowsAffected()checkErr(err)fmt.Println(affect)//查询数据rows, err := db.Query("SELECT * FROM userinfo")checkErr(err)for rows.Next() {var uid intvar username stringvar department stringvar created stringerr = rows.Scan(&uid, &username, &department, &created)checkErr(err)fmt.Println(uid)fmt.Println(username)fmt.Println(department)fmt.Println(created)}//删除数据//stmt, err = db.Prepare("delete from userinfo where uid=$1")//checkErr(err)//res, err = stmt.Exec(1)//checkErr(err)//affect, err = res.RowsAffected()//checkErr(err)//fmt.Println(affect)//db.Close()
}

 golang的运行打印信息

 4.7验证数据,去数据库中验证数据

 4.8总结

我们经常使用的数据库,sqlite3,mysql,postgrep基本满足需求了

五、测试环境的更改,docker的使用;

5.1docker常用命令;

在我的另外一个文章里,已经写好了,就是不在这里说了,感兴趣的可以看下docker的介绍

https://blog.csdn.net/wtt234/article/details/131674586

5.2.以mysql为例进行演示

跟上面一样,创建表以及运行golang代码,同上

重点看下5.1中关于msyql的部分在docker中的使用,后续实验环境可以考虑docker为主。

5.3下面的截图都是用navicat访问docker中的mysql镜像中的mysql==navicat中内容

 

 

 

 在navicat中创建表


CREATE TABLE `userinfo` (`uid` INT(10) NOT NULL AUTO_INCREMENT,`username` VARCHAR(64) NULL DEFAULT NULL,`departname` VARCHAR(64) NULL DEFAULT NULL,`created` DATE NULL DEFAULT NULL,PRIMARY KEY (`uid`)
);CREATE TABLE `userdetail` (`uid` INT(10) NOT NULL DEFAULT '0',`intro` TEXT NULL,`profile` TEXT NULL,PRIMARY KEY (`uid`)
)

 

 创建表成功

 

 5.4===docker中内容===========验证在docker中mysql是否有数据==========================

在docker中验证下,是否新建了mytest数据库,数据库存在

 在dicker中是否创建了表 表存在


mysql> use mytest;   #使用数据库

mysql> show tables;   #数据库下都是有哪些表



 

 5.5golang代码运行

修改数据库连接信息

db, err := sql.Open("mysql", "test:123456@tcp(192.168.46.128:3306)/mytest?charset=utf8mb4")

 所有代码:

package mainimport ("database/sql""fmt"//"time"_ "github.com/go-sql-driver/mysql"
)func checkErr(err error) {if err != nil {panic(err)}
}func main() {//db, err := sql.Open("mysql", "root:R1234567890@/mytest?charset=utf8mb4")//db, err := sql.Open("mysql", "root:root123456@tcp(127.0.0.1:3306)/mytest?charset=utf8mb4")db, err := sql.Open("mysql", "test:123456@tcp(127.0.0.1:3306)/mytest?charset=utf8mb4")checkErr(err)//插入数据stmt, err := db.Prepare("INSERT userinfo SET username=?,departname=?,created=?")checkErr(err)res, err := stmt.Exec("tom", "研发部门", "2023-1-09")checkErr(err)id, err := res.LastInsertId()checkErr(err)fmt.Println(id)//更新数据stmt, err = db.Prepare("update userinfo set username=? where uid=?")checkErr(err)res, err = stmt.Exec("astaxieupdate", id)checkErr(err)affect, err := res.RowsAffected()checkErr(err)fmt.Println(affect)//查询数据rows, err := db.Query("SELECT * FROM userinfo")checkErr(err)for rows.Next() {var uid intvar username stringvar department stringvar created stringerr = rows.Scan(&uid, &username, &department, &created)checkErr(err)fmt.Println(uid)fmt.Println(username)fmt.Println(department)fmt.Println(created)}//删除数据//stmt, err = db.Prepare("delete from userinfo where uid=?")//checkErr(err)//res, err = stmt.Exec(id)//checkErr(err)//affect, err = res.RowsAffected()//checkErr(err)//fmt.Println(affect)//db.Close()
}

5.7验证结果

golang的中显示的运行结果

 5.8显示结果

5.8.1navacat 中显示结果

 

5.8.2docker中数据库显示的信息

 5.9docker运行验证环境测试效果不错,满足测试。

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

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

相关文章

Java新特性:Lambda表达式

Java新特性:Lambda表达式 Lambda 表达式(Lambda expression),也可称为闭包(Closure),是 Java(SE)8 中一个重要的新特性。Lambda 表达式允许我们通过表达式来代替功能接口…

Django_haystack全文搜索

haystack是全文搜索的框架,支持whoosh、solr、Xapian、Elasticsearc四种全文检索引擎,点击查看官方网站。 whoosh是用纯Python编写的全文搜索引擎,虽然性能比不上sphinx、xapian、Elasticsearc等,但是无二进制包,程序…

一百二十八、Kettle——从Hive增量导入到ClickHouse

一、目标 用Kettle把Hive的DWS层数据增量导入到ClickHouse中 工具版本:Kettle:8.2 Hive:3.1.2 ClickHouse21.9.5.16 全量导入请访问拙作链接 http://t.csdn.cn/Rqvuvhttp://t.csdn.cn/Rqvuv 二、前提准备 (一)kettl…

Vue3 +Echarts5 可视化大屏——屏幕适配

项目基于Vue3 Echarts5 开发,屏幕适配是使用 scale 方案 Echarts组件按需引入,减少打包体积 地图组件封装(全国&省份地图按需加载) 效果图: 屏幕适配 大屏适配常用的方案有 rem vw/vh 和 scale 。 rem vw/vh …

vue 使用 npm run dev命令后 自动打开浏览器为谷歌

文章目录 需求分析 需求 vue 启动后,想要其自动打开指定浏览器(谷歌)并设置要打开的IP地址和端口号 分析 package.json 打开package.json文件加上 --open chrome index.js 打开index.js文件,将浏览器设置为自动打开

模板类与继承

模板类与继承 模板类继承普通类普通类继承模板类的实例化版本。普通类继承模板类模板类继承模板类模板类继承模板参数给出的基类 模板类继承普通类 基类 派生类 测试函数; 普通类继承模板类的实例化版本。 模板基类 普通类继承模板基类的实例化版本: 普通…

LVS和keepa lived群集

keepa lived 简述 一.keepalived 服务重要功能 1管理LS负载均衡器软件 keepalived可以通过读取自身的配置文件,实现通过更底层的接口直接管理Lvs配置以及服务的启动 停止功能 这会使 LVS应用跟更加简便 2 支持故障自动切换 (failover) ①两台知己同时安装好kee…

Kotlin~Decorator装饰器模式

概念 装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。可以运行时动态添加新的功能,而无需改变原来的代码。 特点: 灵活扩展新的功能动态…

buu-Reverse-[2019红帽杯]childRE

目录 [2019红帽杯]childRE 修饰函数名和函数签名是什么? 对于变换部分的具体分析: [2019红帽杯]childRE 下载附件,查壳,无壳 在IDA中打开,定位主函数 int __cdecl main(int argc, const char **argv, const char …

Kotlin~责任链模式

概念 允许多个对象按顺序处理请求或任务。 角色介绍 Handler: 处理器接口,提供设置后继者&#xff08;可选&#xff09;ConcreteHandler&#xff1a;具体处理器&#xff0c;处理请求 UML 代码实现 比如ATM机吐钱就可以使用责任链实现。 class PartialFunction<in P1, o…

POLARDB IMCI 白皮书 云原生HTAP 数据库系统 一 列式数据是如何存储与处理的

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

无聊猿惨遭亏本甩卖 “贵族”持有人沦为“大冤种

被称为NFT贵族的无聊猿&#xff08;BAYC&#xff09;正在进行挥泪大甩卖&#xff0c;歌手黄立成等持有者们近期不断抛售BAYC NFT&#xff0c;导致该系列NFT地板价一度跌至30 ETH&#xff08;约5.7万美元&#xff09;以下。 一年多以前&#xff0c;BAYC还是时尚界的宠儿&#x…