《Go语言从入门到精通》Go语言进行数据库开发_第1页
《Go语言从入门到精通》Go语言进行数据库开发_第2页
《Go语言从入门到精通》Go语言进行数据库开发_第3页
《Go语言从入门到精通》Go语言进行数据库开发_第4页
《Go语言从入门到精通》Go语言进行数据库开发_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Go语言进行数据库开发Go语言从入门到精通掌握Go语言数据库开发的基本方法了解NoSQL数据库的基础开发01DATABASE02SQL03NoSQLtarget目标掌握SQL数据库的常用操作目录导航12.1Go语言进行数据库开发的一般方式ContentsGo语言支持传统SQL数据库的方式Go语言标准库中并不“直接”支持任何传统数据库的开发通过database/sql包提供了一个标准的SQL类型数据库的接口

任何第三方包只要按要求实现了该接口,都可以按统一的方式来使用进行数据库访问和操作目前的主流数据库基本都有可用的第三方包Go语言SQL数据库支持的优点开发人员可以只维护一套代码仅需更换数据库驱动(即相应的第三方Go语言包)即可实现更换数据库目录导航12.2安装SQLite数据库驱动Contents支持SQLite数据库的第三方包goget-v/mattn/go-sqlite3

仅在程序开发(编译)时需要该包,发布可执行程序时,用户电脑上无需安装任何驱动支持SQLite数据库的第三方包goget-v/mattn/go-sqlite3

仅在程序开发(编译)时需要该包,发布可执行程序时,用户电脑上无需安装任何驱动

由于Go语言SQL数据库访问的标准型,以SQLite为例,其他数据库也是类似的访问方式,一般仅需调整数据库连接配置即可目录导航12.3基本的数据库操作-新建库表、插入记录和查询Contents引用标准SQL包和SQLite数据库包package

main

import

(

"os"

t

"tools"

"database/sql"

_

"/mattn/go-sqlite3")下划线引用表示执行该包中的所有init函数,但不会使用其中的其他内容创建新SQLite数据库//

如果存在该库(SQLite库是放在单一的文件中的)则删除该文件if

t.FileExists(`c:\test\test.db`)

{

os.Remove(`c:\test\test.db`)}

//

创建新库dbT,

errT

:=

sql.Open("sqlite3",

`c:\test\test.db`)

if

errT

!=

nil

{

t.Printfln("创建数据库时发生错误:%v",

errT.Error())

return}

defer

dbT.Close()SQLite数据库是基于文件的轻量级关系型数据库向库中新增(插入)记录//

开始一个数据库事务txT,

errT

:=

dbT.Begin()if

errT

!=

nil

{

t.Printfln("新建事务时发生错误:%v",

errT.Error())

return}

//

准备一个SQL语句,用于向表中插入记录stmtT,

errT

:=

txT.Prepare("insert

into

TEST(ID,

CODE)

values(?,

?)")if

errT

!=

nil

{

t.Printfln("准备SQL语句插入记录时发生错误:%v",

errT.Error())

return}defer

stmtT.Close()

//

向表中插入10条记录,每条记录的ID字段用循环变量的值赋值for

i

:=

0;

i

<

10;

i++

{

_,

errT

=

stmtT.Exec(i,

t.GenerateRandomString(5,

8,

true,

true,

true,

false,

false,

false))

if

errT

!=

nil

{

t.Printfln("执行SQL插入记录语句时发生错误:%v",

errT.Error())

return

}}

txT.Commit()//

执行事务,此时新纪录才会被真正插入到表中查询数据库rowsT,

errT

:=

dbT.Query("select

ID,

CODE

from

TEST")if

errT

!=

nil

{

t.Printfln("执行SQL查询语句时发生错误:%v",

errT.Error())

return}defer

rowsT.Close()for

rowsT.Next()

{//

遍历查询结果

var

idT

int

var

codeT

string

errT

=

rowsT.Scan(&idT,

&codeT)

if

errT

!=

nil

{

t.Printfln("遍历查询结果时发生错误:%v",

errT.Error())

return

}

t.Printfln("ID:

%v,

CODE:

%v",

idT,

codeT)}

//

检查查询结果的错误errT

=

rowsT.Err()if

errT

!=

nil

{

t.Printfln("查询结果有错误:%v",

errT.Error())}目录导航12.4删除记录、准备SQL查询等操作Contents“准备”查询数据库的SQL语句stmtT,

errT

:=

dbT.Prepare("select

CODE

from

TEST

where

ID

=

?")if

errT

!=

nil

{

t.Printfln("准备SQL查询语句时发生错误:%v",

errT.Error())

return}

defer

stmtT.Close()

var

codeT

string

errT

=

stmtT.QueryRow("5").Scan(&codeT)

if

errT

!=

nil

{

t.Printfln("从查询结果中获取字段数值时发生错误:%v",

errT.Error())

return}

t.Printfln("第5条记录中的CODE字段值为:%v",

codeT)送入前面用?号声明的参数删除数据库记录//

删除TEST表中所有记录_,

errT

=

dbT.Exec("delete

from

TEST")if

errT

!=

nil

{

t.Printfln("删除数据库表记录时发生错误:%v",

errT.Error())

return}//

删除TEST表中符合条件的记录_,

errT

=

dbT.Exec("delete

from

TESTwhereID<3")if

errT

!=

nil

{

t.Printfln("删除数据库表记录时发生错误:%v",

errT.Error())

return}目录导航12.5获取记录条数、删表等操作Contents查询数据库记录条数//

查询表中所有符合条件的记录总数

var

countT

int64

errT

=

dbT.QueryRow("select

count(*)

from

TEST").Scan(&countT)if

errT

!=

nil

{

t.Printfln("执行SQL查询语句时发生错误:%v",

errT.Error())

return}

t.Printfln("库表中共有%v条记录",

countT)删除数据库表查询数据库记录条数//

删除库表

_,

errT

=

dbT.Exec(`drop

table

TEST`)if

errT

!=

nil

{

t.Printfln("删除库表时发生错误:%v",

errT.Error())

return}目录导航12.6SQL型数据库开发总结Contents语法严格的益处Go语言SQL型数据库的开发基本是类似的一般数据库连接类型和连接字串稍作改动即可(例:Oracle数据库第三方包为/godror/godror,连接类型为“godror”,连接字串为`user/password@:1521/dbname`)偶尔一些数据库特有的SQL语法稍作相应改动目录导航12.7NoSQL型数据库开发示例ContentsNoSQL数据库

NoSQL是“nonSQL”的简称(也有说是“NotonlySQL”即“不仅仅是SQL”的),由于SQL语言是关系型数据库使用的主要语言,因此NoSQL指的是不使用关系型数据库的新数据库技术摒弃了传统关系型数据库中用二维表来表达数据的形式主要支持的是以键值对(Key-ValuePair)为主的数据存储方式,也支持图像、文档、数据对象等的存储创建NoSQL数据库import

(

//

应用所需的包

"/dgraph-io/badger")……//

准备创建数据库的设置参数optionsT

:=

badger.DefaultOptions

//

设置数据库的工作目录optionsT.Dir

=

`c:\test\db`optionsT.ValueDir

=

`c:\test\db`

//

创建或打开数据库dbT,

errT

:=

badger.Open(optionsT)if

errT

!=

nil

{

log.Fatal(errT)}

//

确保退出前关闭数据库defer

dbT.Close()向NoSQL数据库中写入数据//

准备用于测试的数据,是映射类型的数据dataT

:=

make(map[string]string)

dataT["ok"]

=

"yes"dataT["名字"]

=

"张三"

//

新建一个事务transT

:=

dbT.NewTransaction(true)

//

遍历测试数据并存入数据库for

k,

v

:=

range

dataT

{

//

将对应的键值对存入

errT

:=

transT.Set([]byte(k),

[]byte(v))

if

errT

!=

nil

{

fmt.Printf("设置KV对时发生错误:%v",

errT.Error())

}

}

//

提交事务,此时才真正写入数据库_

=

transT.Commit()按键名查询NoSQL数据库中的键值//

再次新建一个事务用于查询transT

=

dbT.NewTransaction(true)

//

查询键名为ok对应的键值itemT,

errT

:=

transT.Get([]byte("ok"))

if

errT

!=

nil

{

log.Fatalf("获取KV对时发生错误:%v",

errT)}

//

获取键值valueT,

errT

:=

itemT.ValueCopy(nil)

if

errT

!=

nil

{

log.Fatalf("获取KV对值时发生错误:%v",

errT)}

fmt.Printf("获取到的键名为%v的键值:%v\n",

"ok",

string(valueT))遍历NoSQL数据库中的所有键值对errT

=

dbT.View(func(txn

*badger.Txn)

error

{//

用只读模式打开数据库

optionsT

:=

badger.DefaultIteratorOptions

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论