Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
build-web-application-with-golang
提交
587abe3e
B
build-web-application-with-golang
项目概览
OpenDocCN
/
build-web-application-with-golang
通知
2
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
B
build-web-application-with-golang
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
587abe3e
编写于
9月 11, 2012
作者:
A
astaxie
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
修改一些语句 by 四月份平民
上级
c1e7ec8b
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
5 addition
and
5 deletion
+5
-5
5.1.md
5.1.md
+5
-5
未找到文件。
5.1.md
浏览文件 @
587abe3e
#5.1 database/sql接口
#5.1 database/sql接口
Go和PHP不同的地方是,他没有官方提供数据库驱动,而是
定义了一些标准接口用来开发数据库驱动,第三方用户可以根据定义的接口来开发相应的数据库驱动,其实这样做有一个好处,我们按照标准接口开发的代码,将来迁移数据库是相当方便的,换一个数据库驱动,但是底层的接口没有任何变化
。那么Go都定义了那些标准接口呢?让我们来详细的分析一下
Go和PHP不同的地方是,他没有官方提供数据库驱动,而是
为开发数据库驱动定义了一些标准接口,第三方用户可以根据定义的接口来开发相应的数据库驱动,这样做有一个好处,我们按照标准接口开发的代码, 在需要迁移数据库时,不需要任何修改
。那么Go都定义了那些标准接口呢?让我们来详细的分析一下
##sql.Register
##sql.Register
这个
函数是database/sql里面用来注册数据库驱动的,当第三方开发者开发完毕一个数据库驱动,都会在驱动里面有一个init函数,里面都会调用这个
`Register(name string, driver driver.Driver)`
这个
存在于database/sql的函数是用来注册数据库驱动的,当第三方开发者开发数据库驱动时,都会实现init函数,在init里面会调用这个
`Register(name string, driver driver.Driver)`
完成本驱动的注册。
我们来看一下mymysql、sqlite3的驱动里面都是怎么调用的:
我们来看一下mymysql、sqlite3的驱动里面都是怎么调用的:
...
@@ -19,7 +19,7 @@ Go和PHP不同的地方是,他没有官方提供数据库驱动,而是定义
...
@@ -19,7 +19,7 @@ Go和PHP不同的地方是,他没有官方提供数据库驱动,而是定义
sql.Register("mymysql", &d)
sql.Register("mymysql", &d)
}
}
我们看到第三方驱动都是通过调用这个函数来注册自己的驱动名称以及相应的driver。
database/sql内部是一个map类型用
来存储相应的驱动。
我们看到第三方驱动都是通过调用这个函数来注册自己的驱动名称以及相应的driver。
在database/sql内部通过一个map
来存储相应的驱动。
var drivers = make(map[string]driver.Driver)
var drivers = make(map[string]driver.Driver)
...
@@ -32,7 +32,7 @@ Go和PHP不同的地方是,他没有官方提供数据库驱动,而是定义
...
@@ -32,7 +32,7 @@ Go和PHP不同的地方是,他没有官方提供数据库驱动,而是定义
> "database/sql"
> "database/sql"
> _ "github.com/mattn/go-sqlite3"
> _ "github.com/mattn/go-sqlite3"
>
>
>新手都会被这个`_`所迷惑,其实这个就是Go设计的巧妙之处,我们
知道在变量赋值的时候看到过这个,是用来忽略变量的意思,那么这个包引入也是,这个只是引入包而不直接使用这个pkg的调用,我们在2.3流程和函数里面介绍过init函数的初始化过程,包在引入的时候会去初始化包内部的init函数,那么
我们引入上面的数据库驱动包之后会去调用init函数,然后在init函数里面注册了这个数据库驱动,这样我们就可以在接下来的代码中直接使用这个数据库驱动了。
>新手都会被这个`_`所迷惑,其实这个就是Go设计的巧妙之处,我们
在变量赋值的时候经常看到这个,它是用来忽略变量的占位符,那么这个包引入也是,这儿的意思是引入此包而不直接使用这个包中定义的函数,变量等资源,我们在2.3流程和函数里面介绍过init函数的初始化过程,包在引入的时候会去调用包的init函数以完成对包的初始化,因此
我们引入上面的数据库驱动包之后会去调用init函数,然后在init函数里面注册了这个数据库驱动,这样我们就可以在接下来的代码中直接使用这个数据库驱动了。
##driver.Driver
##driver.Driver
数据库驱动是一个接口定义,他定义了一个method: Open(name string),这个方法返回一个数据库的Conn接口,这个Conn只能用来进行一次goroutine的操作。
数据库驱动是一个接口定义,他定义了一个method: Open(name string),这个方法返回一个数据库的Conn接口,这个Conn只能用来进行一次goroutine的操作。
...
@@ -41,7 +41,7 @@ Go和PHP不同的地方是,他没有官方提供数据库驱动,而是定义
...
@@ -41,7 +41,7 @@ Go和PHP不同的地方是,他没有官方提供数据库驱动,而是定义
Open(name string) (Conn, error)
Open(name string) (Conn, error)
}
}
每个驱动
的这个函数都是通过name参数用来解析,然后初始化一个Conn返回
。
每个驱动
都会定义这个函数,它会解析name参数来获取相关数据库的连接信息,解析完成后,它将使用此信息来初始化一个Conn并返回它
。
##driver.Conn
##driver.Conn
数据库连接是一个接口定义,他定义了一系列方法,这个Conn只能应用在一个goroutine里面,不能使用在多个goroutine里面。
数据库连接是一个接口定义,他定义了一系列方法,这个Conn只能应用在一个goroutine里面,不能使用在多个goroutine里面。
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录