这是我参与「第三届青训营 -后端场」笔记创作活动的的第5篇笔记
1.什么是ORM?
对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。
2.对象如何与数据库进行映射?
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.Row,row.Scan()接受1或多个指针作为参数,可以获取对应列(column)的值,在这个示例中,只有Name一列,因此传入字符串指针&name即可获取到查询的结果。
掌握了基础的 SQL 语句和 Go 标准库 database/sql 的使用,可以开始实现 ORM 框架的雏形了。