iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Go 语言如何操作常见的数据库
  • 343
分享到

Go 语言如何操作常见的数据库

2024-04-02 19:04:59 343人浏览 独家记忆
摘要

使用Mysql数据库 目前 Internet 上流行的网站构架方式是 LAMP/LNMP,其中的 M 即 mysql, 作为数据库,Mysql 以免费、开源、使用方便为优势成为了很多web开发的后

使用Mysql数据库

目前 Internet 上流行的网站构架方式是 LAMP/LNMP,其中的 M 即 mysql, 作为数据库,Mysql 以免费、开源、使用方便为优势成为了很多web开发后端数据库存储引擎。

Go中支持MySQL的驱动目前比较多,有如下几种,有些是支持database/sql标准,而有些是采用了自己的实现接口,常用的有如下几种:

  • https://GitHub.com/go-sql-driver/mysql 支持database/sql,全部采用go写。

  • Https://github.com/ziutek/mymysql 支持database/sql,也支持自定义的接口,全部采用go写。

  • https://github.com/Philio/GoMySQL 不支持database/sql,自定义接口,全部采用go写。

接下来的例子主要以第一个驱动为例,推荐主要理由是:

  • 这个驱动比较新,维护的比较好;

  • 完全支持database/sql接口;

  • 支持keepalive,保持长连接。

接下来的几个小节里面我们都将采用同一个数据库表结构:数据库test,用户表userinfo,关联用户信息表userdetail。




 1


CREATE

 

TABLE

 

`userinfo`

 (

2      `uid`   INT ( 10 )  NOT   NULL  AUTO_INCREMENT,
3      `username`   VARCHAR ( 64 )  NULL   DEFAULT   NULL ,
4      `departname`   VARCHAR ( 64 )  NULL   DEFAULT   NULL ,
5      `created`   DATE   NULL   DEFAULT   NULL ,
6     PRIMARY  KEY  ( `uid` )
7 );
8
9 CREATE   TABLE   `userdetail`  (
10      `uid`   INT ( 10 )  NOT   NULL   DEFAULT   '0' ,
11      `intro`   TEXT   NULL ,
12      `profile`   TEXT   NULL ,
13     PRIMARY  KEY  ( `uid` )
14 )

如下示例将示范如何使用database/sql接口对数据库表进行增删改查操作:




 1


// 示例代码11-15


2 package  main
3
4 import  (
5      "database/sql"
6      "fmt"
7      //"time"
8
9     _  "github.com/go-sql-driver/mysql"
10 )
11
12 func   main ()  {
13     db, err := sql.Open( "mysql" ,  "zuolan:zuolan@/test?charset=utf8" )
14     checkErr(err)
15
16      //插入数据
17     stmt, err := db.Prepare( "INSERT userinfo SET username=?,departname=?,created=?" )
18     checkErr(err)
19
20     res, err := stmt.Exec( "张三" ,  "研发部门" ,  "2017-09-09" )
21     checkErr(err)
22
23     id, err := res.LastInsertId()
24     checkErr(err)
25
26     fmt.Println(id)
27      //更新数据
28     stmt, err = db.Prepare( "update userinfo set username=? where uid=?" )
29     checkErr(err)
30
31     res, err = stmt.Exec( "zuolanupdate" , id)
32     checkErr(err)
33
34     affect, err := res.RowsAffected()
35     checkErr(err)
36
37     fmt.Println(affect)
38
39      //查询数据
40     rows, err := db.Query( "SELECT * FROM userinfo" )
41     checkErr(err)
42
43      for  rows.Next() {
44          var  uid  int
45          var  username  string
46          var  department  string
47          var  created  string
48         err = rows.Scan(&uid, &username, &department, &created)
49         checkErr(err)
50         fmt.Println(uid)
51         fmt.Println(username)
52         fmt.Println(department)
53         fmt.Println(created)
54     }
55
56      //删除数据
57     stmt, err = db.Prepare( "delete from userinfo where uid=?" )
58     checkErr(err)
59
60     res, err = stmt.Exec(id)
61     checkErr(err)
62
63     affect, err = res.RowsAffected()
64     checkErr(err)
65
66     fmt.Println(affect)
67
68     db.Close()
69
70 }
71
72 func   checkErr (err error)  {
73      if  err !=  nil  {
74          panic (err)
75     }
76 }

通过上面的代码我们可以看出,Go操作MySQL数据库是很方便的。

sql.Open()函数用来打开一个注册过的数据库驱动,go-sql-driver中注册了mysql这个数据库驱动,第二个参数是DSN(Data Source Name),它是go-sql-driver定义的一些数据库链接和配置信息。它支持如下格式:




1


user

@

unix

(/

path

/

to

/

Socket

)/

dbname

?

charset

=

utf8


2 user:passWord@tcp(localhost: 5555 )/dbname?charset=utf8
3 user:password@/dbname
4 user:password@tcp([de:ad:be:ef::ca:fe]: 80 )/dbname

db.Prepare()函数用来返回准备要执行的sql操作,然后返回准备完毕的执行状态。

db.Query()函数用来直接执行Sql返回Rows结果。

stmt.Exec()函数用来执行stmt准备好的SQL语句

我们可以看到我们传入的参数都是=?对应的数据,这样做的方式可以一定程度上防止SQL注入。

使用SQLite数据库

SQLite是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的SQL数据库引擎。其特点是高度便携、使用方便、结构紧凑、高效、可靠。与其他数据库管理系统不同,SQLite的安装和运行非常简单,在大多数情况下,只要确保SQLite的二进制文件存在即可开始创建、连接和使用数据库。

如果您正在寻找一个嵌入式数据库项目或解决方案,SQLite是绝对值得考虑。SQLite可以是说开源的Access。

Go支持sqlite的驱动也比较多,但是很多都不支持database/sql接口:

  • https://github.com/mattn/go-sqlite3 支持database/sql接口,基于cgo(关于cgo的知识请参看官方文档)。

  • https://github.com/feyeleanor/gosqlite3 不支持database/sql接口,基于cgo。

  • https://github.com/phf/go-sqlite3 不支持database/sql接口,基于cgo。

目前支持database/sql的SQLite数据库驱动比较少,采用标准接口有利于以后出现更好的驱动的时候做迁移,因此本节后面都采用第一个驱动。

示例的数据库表结构如下所示,相应的建表SQL:




 1


CREATE

 

TABLE

 

`userinfo`

 (

2      `uid`   INTEGER  PRIMARY  KEY  AUTOINCREMENT,
3      `username`   VARCHAR ( 64 )  NULL ,
4      `departname`   VARCHAR ( 64 )  NULL ,
5      `created`   DATE   NULL
6 );
7
8 CREATE   TABLE   `userdeatail`  (
9      `uid`   INT ( 10 )  NULL ,
10      `intro`   TEXT   NULL ,
11      `profile`   TEXT   NULL ,
12     PRIMARY  KEY  ( `uid` )
13 );

看下面Go程序是如何操作数据库表,进行数据增删改查的:




 1


// 示例代码11-16


2 package  main
3
4 import  (
5      "database/sql"
6      "fmt"
7      "time"
8
9     _  "github.com/mattn/go-sqlite3"
10 )
11
12 func   main ()  {
13     db, err := sql.Open( "sqlite3" ,  "./demo.db" )
14     checkErr(err)
15
16      //插入数据
17     stmt, err := db.Prepare( "INSERT INTO userinfo(username, departname, created) values(?,?,?)" )
18     checkErr(err)
19
20     res, err := stmt.Exec( "张三" ,  "研发部门" ,  "2017-09-09" )
21     checkErr(err)
22
23     id, err := res.LastInsertId()
24     checkErr(err)
25
26     fmt.Println(id)
27      //更新数据
28     stmt, err = db.Prepare( "update userinfo set username=? where uid=?" )
29     checkErr(err)
30
31     res, err = stmt.Exec( "zuolanupdate" , id)
32     checkErr(err)
33
34     affect, err := res.RowsAffected()
35     checkErr(err)
36
37     fmt.Println(affect)
38
39      //查询数据
40     rows, err := db.Query( "SELECT * FROM userinfo" )
41     checkErr(err)
42
43      for  rows.Next() {
44          var  uid  int
45          var  username  string
46          var  department  string
47          var  created time.Time
48         err = rows.Scan(&uid, &username, &department, &created)
49         checkErr(err)
50         fmt.Println(uid)
51         fmt.Println(username)
52         fmt.Println(department)
53         fmt.Println(created)
54     }
55
56      //删除数据
57     stmt, err = db.Prepare( "delete from userinfo where uid=?" )
58     checkErr(err)
59
60     res, err = stmt.Exec(id)
61     checkErr(err)
62
63     affect, err = res.RowsAffected()
64     checkErr(err)
65
66     fmt.Println(affect)
67
68     db.Close()
69
70 }
71
72 func   checkErr (err error)  {
73      if  err !=  nil  {
74          panic (err)
75     }
76 }

我们可以看到上面的代码和MySQL例子里面的代码几乎是一模一样的,唯一改变的就是导入的驱动改变了,然后调用sql.Open是采用了SQLite的方式打开。

使用postgresql数据库

PostgreSQL是一个自由的对象-关系数据库服务器(数据库管理系统),它在灵活的BSD风格许可证下发行。它提供了相对其他开放源代码数据库系统(比如MySQL和Firebird),和对专有系统比如oracle、Sybase、IBM的DB2和Microsoft SQL Server的一种选择。

PostgreSQL和MySQL比较,它更加庞大一点,因为它是用来替代Oracle而设计的。所以在企业应用中采用PostgreSQL是一个明智的选择。

MySQL被Oracle收购之后正在逐步的封闭(自MySQL 5.5.31以后的所有版本将不再遵循GPL协议),鉴于此,将来我们也许会选择PostgreSQL而不是MySQL作为项目的后端数据库。

Go实现的支持PostgreSQL的驱动也很多,因为国外很多人在开发中使用了这个数据库。

  • https://github.com/lib/pq 支持database/sql驱动,纯Go写的;

  • https://github.com/jbarham/gopgsqldriver 支持database/sql驱动,纯Go写的;

  • https://github.com/lxn/go-pgsql 支持database/sql驱动,纯Go写的。

在下面的示例中采用第一个驱动,因为它目前使用的人最多,在Github上也比较活跃。

数据库建表语句:




 1


CREATE

 

TABLE

 userinfo

2 (
3     uid  serial   NOT   NULL ,
4     username  character   varying ( 100 )  NOT   NULL ,
5     departname  character   varying ( 500 )  NOT   NULL ,
6     Created  date ,
7      CONSTRAINT  userinfo_pkey PRIMARY  KEY  (uid)
8 )
9 WITH  (OIDS= FALSE );
10
11 CREATE   TABLE  userdeatail
12 (
13     uid  integer ,
14     intro  character   varying ( 100 ),
15     profile  character   varying ( 100 )
16 )
17 WITH (OIDS= FALSE );

看下面这个Go如何操作数据库表,进行数据的增删改查:




 1


// 示例代码11-17


2 package  main
3
4 import  (
5      "database/sql"
6      "fmt"
7
8     _  "github.com/lib/pq"
9 )
10
11 func   main ()  {
12     db, err := sql.Open( "postgres" ,  "user=zuolan password=zuolan dbname=test sslmode=disable" )
13     checkErr(err)
14
15      //插入数据
16     stmt, err := db.Prepare( "INSERT INTO userinfo(username,departname,created) VALUES($1,$2,$3) RETURNING uid" )
17     checkErr(err)
18
19     res, err := stmt.Exec( "张三" ,  "研发部门" ,  "2017-09-09" )
20     checkErr(err)
21
22      // pg不支持这个函数,因为他没有类似MySQL的自增ID
23      // id, err := res.LastInsertId()
24      // checkErr(err)
25      // fmt.Println(id)
26
27      var  lastInsertId  int
28     err = db.QueryRow( "INSERT INTO userinfo(username,departname,created) VALUES($1,$2,$3) returning uid;" ,  "zuolan" ,  "研发部门" ,  "2017-09-09" ).Scan(&lastInsertId)
29     checkErr(err)
30     fmt.Println( "最后插入id =" , lastInsertId)
31
32
33      //更新数据
34     stmt, err = db.Prepare( "update userinfo set username=$1 where uid=$2" )
35     checkErr(err)
36
37     res, err = stmt.Exec( "zuolanupdate" ,  1 )
38     checkErr(err)
39
40     affect, err := res.RowsAffected()
41     checkErr(err)
42
43     fmt.Println(affect)
44
45      //查询数据
46     rows, err := db.Query( "SELECT * FROM userinfo" )
47     checkErr(err)
48
49      for  rows.Next() {
50          var  uid  int
51          var  username  string
52          var  department  string
53          var  created  string
54         err = rows.Scan(&uid, &username, &department, &created)
55         checkErr(err)
56         fmt.Println(uid)
57         fmt.Println(username)
58         fmt.Println(department)
59         fmt.Println(created)
60     }
61
62      //删除数据
63     stmt, err = db.Prepare( "delete from userinfo where uid=$1" )
64     checkErr(err)
65
66     res, err = stmt.Exec( 1 )
67     checkErr(err)
68
69     affect, err = res.RowsAffected()
70     checkErr(err)
71
72     fmt.Println(affect)
73
74     db.Close()
75
76 }
77
78 func   checkErr (err error)  {
79      if  err !=  nil  {
80          panic (err)
81     }
82 }

从上面的代码我们可以看到,PostgreSQL是通过 1, 2这种方式来指定要传递的参数,而不是MySQL中的?,另外在sql.Open中的dsn信息的格式也与MySQL的驱动中的dsn格式不一样,所以在使用时请注意它们的差异。

还有pg不支持LastInsertId函数,因为PostgreSQL内部没有实现类似MySQL的自增ID返回,其他的代码几乎是一模一样。

NoSQL数据库操作

NoSQL(Not Only SQL),指的是非关系型的数据库。随着WEB2.0的兴起,传统的关系数据库在应付Web2.0网站,特别是超大规模和高并发的SNS类型的Web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。

而Go语言作为21世纪的C语言,对NOSQL的支持也是很好,目前流行的NOSQL主要有RedismongoDB、Cassandra和Membase等。这些数据库都有高性能、高并发读写等特点,目前已经广泛应用于各种应用中。

1. Redis

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。

目前应用redis最广泛的应该是新浪微博平台,其次还有Facebook收购的图片社交网站instagram。Go目前支持redis的驱动有如下:

  • https://github.com/garyburd/redigo

  • https://github.com/go-redis/redis

  • https://github.com/hoisie/redis

  • https://github.com/alphazero/Go-Redis

  • https://github.com/simonz05/godis

推荐使用第一个,用法上和上面驱动没有太大区别,限于篇幅不再展开。

2. mongoDB

MongoDB是一个高性能,开源,无模式的文档型数据库,是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,采用的是类似JSON的bjson格式来存储数据,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引

目前Go支持mongoDB最好的驱动就是mgo(http://labix.org/mgo),这个驱动目前最有可能成为官方的pkg。安装mgo的命令为:


1go get gopkg.in/mgo.v2


您可能感兴趣的文档:

--结束END--

本文标题: Go 语言如何操作常见的数据库

本文链接: https://www.lsjlt.com/news/46494.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解Go语言中的数据库操作
    目录原生SQL方式ORM方式数据库是应用开发中必须要掌握的技巧,通常在数据库开发过程中,会有两种不同的方式: 直接使用SQL语句,这种方式下,直接编写SQL,简单直观,但是可维护性较...
    99+
    2023-02-07
    Go语言数据库操作 Go语言数据库 Go 数据库
  • Go语言中常见的文件操作分享
    目录常用包os与I/O操作相关包常用文件/目录操作路径拼接创建文件(touch)获取文件信息读取文件内容写入文件内容常用包 文件操作应该是应用程序里非常常见的一种操作,无论是哪种应用...
    99+
    2023-01-30
    Go语言常见文件操作 Go语言文件操作 Go 文件操作
  • Go语言如何实现数据库的增删改查操作?
    Go语言是一种高效、简洁且易于学习的编程语言,因其在并发编程和网络编程方面的优势而备受开发者青睐。在实际开发中,数据库操作是不可或缺的一部分,本文将介绍如何使用Go语言实现数据库的增删...
    99+
    2024-04-02
  • 如何在go语言中实现数据库操作的功能
    在Go语言中可以使用database/sql包来实现数据库操作的功能。以下是一个简单的示例代码,演示如何连接数据库、插入数据、查询数...
    99+
    2023-10-12
    Go语言
  • C语言常见的文件操作函数
    目录一、文件的打开和关闭1、文件指针2、文件打开和关闭二、文件的顺序读写 1、fgetc()和fputc()函数2、fgets()和fputs()函数 3、fsc...
    99+
    2024-04-02
  • 如何处理Go语言中的并发数据库操作问题?
    如何处理 Go 语言中的并发数据库操作问题?在 Go 语言中,处理并发数据库操作是一个常见的挑战。由于数据库访问通常是一个相对较慢的操作,所以在多个 Goroutine 中同时执行数据库操作可能会导致一些问题,如数据竞争和性能下降。在本文中...
    99+
    2023-10-22
    数据竞争问题
  • Go语言字符串常见操作的使用汇总
    目录1. 字节数组2. 头尾处理3. 位置索引4. 替换5. 统计次数6. 重复7. 大小写8. 去除字符9. 字符串切片处理10. 数值处理1. 字节数组 字节与字符的区别 字节(...
    99+
    2024-04-02
  • GO语言中怎么实现Mysql数据库的CURD操作
    这期内容当中小编将会给大家带来有关GO语言中怎么实现Mysql数据库的CURD操作,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、先导入驱动包和增强版Mysql操作库Sqlxpackage m...
    99+
    2023-06-20
  • Navicat操作数据库与Mysql常见命令操作实战
    一:Navicat下载与安装 官网下载链接:Navicat 下载完后直接安装即可 二:数据库的连接 1.打开Navicat软件,点击左上角连接按钮,选择mysql数据库 输入完成后双击连接名,连接成...
    99+
    2023-09-24
    数据库 mysql
  • Go语言使用GORM操作数据库使用指南
    目录简介安装 GORM连接到数据库定义模型自动迁移基本 CRUD 操作插入记录查询记录更新记录删除记录详细api详解1. 查询2. 插入3. 更新4. 删除总结简介 GORM(全称为...
    99+
    2023-05-20
    Go语言 GORM操作数据库 Go语言 操作数据库 Go GORM 数据库 Go语言 GORM
  • 解析常见的数据结构在Go语言中
    Go语言是近年来备受关注和应用的一种编程语言,其简洁、高效和并发性能受到了广大开发者的喜爱。在Go语言中,数据结构是开发过程中不可或缺的一部分,它能够有效地组织和存储数据,提高程序的性能和可维护性。本文将介绍...
    99+
    2024-01-18
    Go语言 数据结构 解析
  • Go语言中常见的数据结构有哪些?
    知识点掌握了,还需要不断练习才能熟练运用。下面编程网给大家带来一个Golang开发实战,手把手教大家学习《Go语言中常见的数据结构有哪些?》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新...
    99+
    2024-04-04
  • Go语言如何实现云上数据缓存操作?
    在当今云计算和大数据时代,高效地进行数据缓存操作已成为许多企业云上应用架构中不可或缺的一部分。而Go语言作为一种高效、简单、可靠的编程语言,正逐渐被越来越多的企业用于处理高并发的云端应用。本文将介绍使用Go语言在云上实现数据缓存的方法和技巧...
    99+
    2023-05-17
    Go语言 云上数据 缓存操作
  • C语言常见的文件操作函数有什么
    这篇文章给大家介绍C语言常见的文件操作函数有什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、文件的打开和关闭1、文件指针每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,...
    99+
    2023-06-26
  • Go语言数组方法:如何有效地操作数组数据
    Go语言是一种强大且高效的编程语言,它支持多种数据结构,其中包括数组。在Go语言中,数组是一种固定长度、相同类型元素的数据结构。通过正确使用数组方法,可以更有效地操作数组数据。本文将重...
    99+
    2024-04-02
  • Go 语言中的 NumPy:如何优化数组操作?
    在数据科学和机器学习领域中,NumPy 是一个广泛使用的 Python 库,它提供了高性能的多维数组操作和数学函数。但是,如果你正在使用 Go 语言编写代码,你可能会发现缺少类似 NumPy 的库来进行数组操作。本文将介绍如何使用 Go ...
    99+
    2023-09-23
    数组 函数 numy
  • 数据库 DML (数据操作语言) 实战指南:让数据操作如虎添翼
    数据库 DML 介绍 DML (Data Manipulation Language),即数据操作语言,是一组用于操作数据库中数据的语言。DML 语句可以用来插入、更新、删除和查询数据,以及对数据进行各种操作。 常用 DML 语句 IN...
    99+
    2024-02-12
    数据库 DML 数据操作语言 SQL INSERT UPDATE DELETE MERGE
  • R语言实现操作MySQL数据库
    用R语言做数据分析时,常常需要从多种数据源取数据,其中数据库是非常常见的数据源。用R操作MySQL数据库,可以说是数据分析师必备的技能了,本文介绍RMySQL包,可以在R语言中对数据...
    99+
    2024-04-02
  • Go语言数据库连接指南:逐步指导你进行数据库操作
    Go语言是一种相对初学者友好的编程语言,它具有简洁、高效和易于学习的特点。作为一名开发人员,与数据库的连接和操作是我们日常工作中必不可少的一部分。在本文中,我将为你展示如何使用Go语言连接数据库,并提供一些具...
    99+
    2024-01-23
    指南 Go语言 数据库连接
  • MySQL 数据库常用操作语句的总结
    创建数据库: CREATE DATABASE database_name; 删除数据库: DROP DATABASE database_name; 选择数据库: USE database_na...
    99+
    2023-09-11
    数据库 mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作