这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
Go-xorm库
xorm是一个简单强大的Go语言ORM库,通过它可以使数据库操作非常简便。
特性
- 全功能 ORM
- 关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承)
- Create,Save,Update,Delete,Find 中钩子方法
- 支持
Preload
、Joins
的预加载 - 事务,嵌套事务,Save Point,Rollback To Saved Point
- Context、预编译模式、DryRun 模式
- 批量插入,FindInBatches,Find/Create with Map,使用 SQL 表达式、Context Valuer 进行 CRUD
- SQL 构建器,Upsert,数据库锁,Optimizer/Index/Comment Hint,命名参数,子查询
- 复合主键,索引,约束
- Auto Migration
- 自定义 Logger
- 灵活的可扩展插件 API:Database Resolver(多数据库,读写分离)、Prometheus…
- 每个特性都经过了测试的重重考验
- 开发者友好
安装
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
同步结构体和数据表
import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"time"
"xorm.io/xorm"
)
func main() {
//数据库连接基本信息
var (
userName string = "root"
password string = "qqq111"
ipAddress string = "127.0.0.1"
port int = 3306
dbName string = "go_test"
charset string = "utf8mb4"
)
// 构建数据库连接信息
dataSource := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s", userName, password, ipAddress, port, dbName, charset)
engine, err := xorm.NewEngine("mysql", dataSource)
if err != nil {
fmt.Println("数据库连接失败!")
}
type User struct {
Id int64
Name string
Age int
password string `xorm:"varchar(200)"`
Createa time.Time `xorm:"created"`
updated time.Time `xorm:"updated"`
}
//创建表
err = engine.Sync(new(User))
if err != nil {
fmt.Println("表结构同步失败!")
}
}
数据插入
通过返回的engine.insert插入数据
// engine.Insert() 插入 对象,返回值:受影响的行数
user := User{Id: 10000, Name: "kuangshen", Age: 18, password: "123456"}
// 受影响的行数
n, _ := engine.Insert(&user)
if n > 1 {
fmt.Println("数据插入成功!")
}
fmt.Println(n)
批量插入的话,使用切片添加
//切片
var users []User
users = append(users, User{Id: 10003, Name: "kuangshen1", Age: 18, password: "137QQQQ"})
users = append(users, User{Id: 10004, Name: "kuangshen1", Age: 18, password: "137QQQQ"})
n, _ = engine.Insert(users)
更新与删除
- Update 更新数据,默认只更新非空和非0的字段
- Delete 删除记录,需要注意,删除必须至少有一个条件,否则会报错
- Exec执行一个SQL语句
//更新
user := User{Name: "qingjiang", Age: 80}
n, _ := engine.ID(1000).Update(&user)
fmt.Println(n)
删除
user := User{Name: "qingjiang", Age: 80}
n, _ := engine.ID(1000).Delete(&user)
fmt.Println(n)
还可以通过执行SQL语句
engine.Exec("update user set age=? where id =?",10,10004)
数据查询
- query 最原始的也支持SQL语句查询,返回的结果类型为[]map[string][]byte,QueryString 返回[]map[string]string,QueryInterface返回[]map[string]interface{}.
- Get查询单条记录
- Find查询多条记录
- Count 获取记录条数
- Iterate 和 Rows 根据条件遍历数据