这是我参与「第三届青训营 -后端场」笔记创作活动的的第6篇笔记。
ppt见设计模式之 database sql与 GORM实践
理解database/sql
Go连接数据库
关于Golang中database/sql包的学习笔记 - SegmentFault 思否
golang——database/sql包学习 - 笃志弘毅 - 博客园 (cnblogs.com)
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
"log"
)
func main() {
var (
id int
name string
age int
)
//get a link from SQL
//root is mysql user's name 123456 is password tcp is connection method test01 is the DB name
db, _ := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test01")
// check the link
err := db.Ping()
if err != nil {
fmt.Println("fault:failed to get a link from SQL")
}
defer db.Close()
//search data by signal line
sqlStr := "select id,name,age from user where id=?"
// function db.QueryRow:
// sqlStr is a query sentence 1 means
err = db.QueryRow(sqlStr, 1).Scan(&id, &name, &age)
if err != nil {
log.Fatal("error{}", err)
return
}
fmt.Printf("id:%d name:%s age:%d\n", id, name, age)
}
简单来说 "database/sql"提供了一个抽象的数据库接口,并没有实现具体的数据库类型。仅仅是实现标准化即在golang中对数据库操作的统一操作格式。 "github.com/go-sql-driver/mysql" 是一个MySQL的驱动,他接收database/sql 传入的命令然后直接作用的MySQL数据库进行操作。
sql.DB不是一个连接,它是数据库的抽象接口。它可以根据driver打开关闭数据库连接,管理连接池。正在使用的连接被标记为繁忙,用完后回到连接池等待下次使用。所以,如果你没有把连接释放回连接池,会导致过多连接使系统资源耗尽。
GORM
什么是ORM
ORM全称为 object-relation-mapping 对象关系映射
数据库中的表与编译器中的变量是没有关联的
ORM提供了实现持久化层的另一种模式,它采用映射元数据来描述对象关系的映射,使得ORM中间件能在任何一个应用的业务逻辑层和数据库层之间充当桥梁
ORM的方法论基于三个核心原则:
- 简单:以最基本的形式建模数据
- 传达性:数据库结构被任何人都能理解的语言文档化
- 精确性:基于数据模型创建正确标准化了的结构 而ORMG是“设计简洁、功能强大、自由扩展的全功能ORM” 参照gorm中文文档
GORM设计原理
SQL是怎么生成的
简单的一个SQL语句
gorm的实现