Gorm是Go语言开发用的比较多的一个ORM.它的功能比较全:
但是这篇文章中并不会直接看Gorm的源码,我们会先从database/sql分析.原因是Gorm也是基于这个包来封装的一些功能.所以只有先了解了database/sql包才能更加好的理解Gorm源码.
database/sql 其实也是一个对于mysql驱动的上层封装."github.com/go-sql-driver/mysql"就是一个对于mysql的驱动,database/sql 就是在这个基础上做的基本封装包含连接池的使用
下面这个是最基本的增删改查操作
操作分下面几个步骤:
因为Gorm的连接池就是使用database/sql包中的连接池,所以这里我们需要学习一下包里的连接池的源码实现.其实所有连接池最重要的就是连接池对象、获取函数、释放函数下面来看一下database/sql中的连接池.
DB对象
获取方法
释放连接方法
连接池的实现有很多方法,在database/sql包中使用的是chan阻塞 使用map记录等待列表,等到有连接释放的时候再把连接传入等待列表中的chan 不在阻塞返回连接.
之前我们看到的Redigo是使用一个chan 来阻塞,然后释放的时候放入空闲列表,在往这一个chan中传入struct{}{},让程序继续 获取的时候再从空闲列表中获取.并且使用的是链表的结构来存储空闲列表.
database/sql 是对于mysql驱动的封装,然而Gorm则是对于database/sql的再次封装.让我们可以更加简单的实现对于mysql数据库的操作.
Go语言操作数据库非常的简单,
他也有一个类似JDBC的东西"database/sql"
实现类是"github.com/go-sql-driver/mysql"
使用过JDBC的人应该一看就懂
对日期的处理比较晦涩,没有JAVA流畅:
复制代码代码如下:
package main
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
"log"
"time"
)
/*
create table t(
id int primary key auto_increment,
ts timestamp
);
*/
func insert(db *sql.DB) {
stmt, err := db.Prepare("insert into t(name,ts) values(?,?)")
defer stmt.Close()
if err != nil {
log.Println(err)
return
}
stmt.Exec("edmond", ts)
func main() {
log.Fatalf("Open database error: %s\n", err)
defer db.Close()
err = db.Ping()
log.Fatal(err)
首选进行登录验证,验证过程完全兼容MySQL认证协议,由于用户名和密码在配置文件中已经设置好,所以可以利用该信息验证连接请求是否合法.
以上就是土嘎嘎小编为大家整理的go语言sql词法分析相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!