ORM 框架
ORM 框架介绍
- ORM:Object Relational Mapping —— 对象关系映射。
-
作用:
- 通过操作结构体对象,来达到操作数据库表的目的。
- 通过结构体对象,来生成数据库表。
-
优点:
- SQL有可能 比较复杂。(Oracle — 子查询 – 嵌套)ORM 操作数据库,不需要使用 SQL
- 不同开发者,书写的 SQL 语句执行效率不同。
-
go语言支持的 ORM:
- gORM:http://gorm.book.jasperxu.com/
- xORM:
gorm 连接数据库、建表
-
grom 操作的都是表、表数据。—— 不能操作数据库!使用SQL配合完成。
create database 库名 charset=utf8;
回顾MySQL
- 确认mysql服务,启动:
ps xua | grep mysql
- 连接MySQL数据库: mysql -uroot -p123456
- 查看数据库:show databases;
- 删除数据库:drop database t1; t1 代表库名。
- 选择数据库、查看表:use 数据库名; show tables;
- 创建数据库: create database test charset=utf8;
gORM 操作 MySQL 数据库
创建表
-
连接数据库
import ( "github.com/jinzhu/gorm" _ "github.com/go-sql-driver/mysql" //"_" 代码不直接使用包, 底层链接要使用! "fmt" ) // mysql: 数据库的驱动名 // 链接数据库 --格式: 用户名:密码@协议(IP:port)/数据库名?xxx&yyy& conn, err := gorm.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test") if err != nil { fmt.Println("gorm.Open err:",err) return } defer conn.Close()
-
创建数据库表。 ——不能使用gorm创建数据库。 提前使用 SQL语句,创建好想要的数据库。
AutoMigrate() 创建表。默认创建的表 为 复数类型。—— 自动添加 “s”
在创建之前, 添加
conn.SingularTable(true)
可以创建非复数表名的表。// 不要复数表名 conn.SingularTable(true) // 借助 gorm 创建数据库表. fmt.Println(conn.AutoMigrate(new(Student)).Error)
-
查看
mysql> desc student; +-------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(255) | YES | | NULL | | | age | int(11) | YES | | NULL | | +-------+--------------+------+-----+---------+----------------+
MySQL 包的 init 方法
-
_ "github.com/go-sql-driver/mysql"
导入包时, “_” ,表示,驱使go系统,在main() 函数被调用之前,自动调用 init() 函数。 -
go语言中有两个特殊函数: —— 首字母小写,包外可见 。
- main() —— 项目的入口函数
- init() —— 当导包,但没有在程序中使用。 在main() 调用之前,自动被调用。
- 查看:光标置于 MySQL包的 “mysql” 上。 使用 Ctrl-鼠标左键。 看到源码。 在 driver.go 底部包含 init() 函数的 定义。
- init() 作用:实现注册 MySQL 驱动。
-
测试:
test2/ 中
--- 创建 test2/ 目录, 在内部添加 init() package test2 import "fmt" // 首字母小写函数, 包作用域, 不能跨包使用! func init() { fmt.Println("测试 init 函数 ....") }
test/ 中
import ( "github.com/jinzhu/gorm" _ "bj38web/web/test2" //"_" 代码不直接使用包, 底层链接要使用! "fmt" ) func main() { fmt.Println("----this is main ---") } 输出: 测试 init 函数