设计模式之 Database/SQL 与 GORM 实践|青训营笔记

149 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第5篇笔记

1.什么是ORM?

对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。

2.对象如何与数据库进行映射?

image.png

3.GORM框架

GORM 框架相当于对象和数据库中间的一个桥梁,借助 ORM 可以避免写繁琐的 SQL 语言,仅仅通过操作具体的对象,就能够完成对关系型数据库的操作。

4.database/sql 标准库

Go 语言提供了标准库 database/sql 用于和数据库的交互,接下来我们写一个 Demo,看一看这个库的用法。

package main  import ( 	"database/sql" 	"log" 	 	
_ "github.com/mattn/go-sqlite3" )  

func main() { 	
db, _ := sql.Open("sqlite3", "gee.db") 	
defer func() { _ = db.Close() 
   }() 	
   
_, _ = db.Exec("DROP TABLE IF EXISTS User;") 	
_, _ = db.Exec("CREATE TABLE User(Name text);") 	

result, err := db.Exec("INSERT INTO User(`Name`) values (?), (?)", "Tom", "Sam")

if err == nil { 		
affected, _ := result.RowsAffected() 		
log.Println(affected) 	
   } 	
   
row := db.QueryRow("SELECT Name FROM User LIMIT 1") 	
var name string 	

if err := row.Scan(&name); err == nil {
log.Println(name) 	
   } 
   
}
  • 使用 sql.Open() 连接数据库,第一个参数是驱动名称,import 语句 _ "github.com/mattn/go-sqlite3" 包导入时会注册 sqlite3 的驱动,第二个参数是数据库的名称,对于 SQLite 来说,也就是文件名,不存在会新建。返回一个 sql.DB 实例的指针。
  • Exec() 用于执行 SQL 语句,如果是查询语句,不会返回相关的记录。所以查询语句通常使用 Query() 和 QueryRow(),前者可以返回多条记录,后者只返回一条记录。
  • Exec()Query()QueryRow() 接受1或多个入参,第一个入参是 SQL 语句,后面的入参是 SQL 语句中的占位符 ? 对应的值,占位符一般用来防 SQL 注入。
  • QueryRow() 的返回值类型是 *sql.Rowrow.Scan() 接受1或多个指针作为参数,可以获取对应列(column)的值,在这个示例中,只有 Name 一列,因此传入字符串指针 &name 即可获取到查询的结果。

掌握了基础的 SQL 语句和 Go 标准库 database/sql 的使用,可以开始实现 ORM 框架的雏形了。