提示:go1.18.6 windows/amd64
文章目录
一、xorm是什么?
xorm 是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作非常简便。
特性:
- 支持 Struct 和数据库表之间的灵活映射,并支持自动同步
- 事务支持
- 同时支持原始SQL语句和ORM操作的混合执行
- 使用连写来简化调用
- 支持使用ID, In, Where, Limit, Join, Having, Table, SQL, Cols等函数和结构体等方式作为条件
- 支持级联加载Struct
- Schema支持(仅Postgres)
- 支持缓存
- 通过 xorm.io/reverse 支持根据数据库自动生成 xorm 结构体
- 支持记录版本(即乐观锁)
通过 xorm.io/builder 内置 SQL Builder 支持 - 上下文缓存支持
- 支持日志上下文
二、安装XORM
go get -u github.com/go-sql-driver/mysql
go get xorm.io/xorm
三、测试连接MySQL
代码如下(示例):
package main
import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"xorm.io/xorm"
)
func main() {
var err error
// 连接数据库
e, err := xorm.NewEngine("mysql", "username:password@tcp(192.168.100.111:3306)/test?charset=utf8")
if err != nil {
panic(err)
}
// 测试链接
if err2 := e.Ping(); err2 != nil {
panic(err2)
} else {
fmt.Println("连接成功")
}
defer e.Close() //延迟关闭数据库
}
四、XORM操作MySQL初探
1. 创建结构体
代码如下(示例):
type Users struct {
Id int `xorm:"pk"`
Name string `xorm:"varchar(25) notnull unique comment('姓名')"`
Age uint8 `xorm:"default 18"`
Create time.Time `xorm:"created"`
}
2. 创建表
代码如下(示例):
err3 := e.Sync2(new(Users)) // 同步数据库结构
fmt.Printf("err3: %v\n", err3)
2. 添加数据
代码如下(示例):
user := Users{
Name: "Tom",
Age: 18,
}
i, _ := e.Insert(&user)
fmt.Printf("i: %v\n", i)
五、定义表结构
代码如下(示例):
package main
import (
"fmt"
"time"
_ "github.com/go-sql-driver/mysql"
"xorm.io/xorm"
"xorm.io/xorm/names"
)
var engine *xorm.Engine
type Users struct {
Id int `xorm:"pk autoincr"`
Name string `xorm:"varchar(25) notnull unique comment('姓名')"`
Age int `xorm:"default 18"`
Create time.Time `xorm:"created"`
}
func init() {
var err error
// 连接数据库
engine, err = xorm.NewEngine("mysql", "root:mysql8@tcp(192.168.100.111:3306)/test?charset=utf8")
if err != nil {
panic(err)
}
}
func main() {
defer engine.Close() //延迟关闭数据库
// 给表名添加前缀
tbMapper := names.NewPrefixMapper(names.SnakeMapper{}, "prefix_")
engine.SetTableMapper(tbMapper)
// 创建表
err3 := engine.Sync2(new(Users)) // 同步数据库结构
fmt.Printf("err3: %v\n", err3)
}
六、表结构的操作
1. 插入数据
代码如下(示例):
user := Users{
Id: 1,
Name: "Tom",
Age: 14,
}
engine.Insert(&user)
fmt.Printf("user.Id: %v\n", user.Id)
2. 查询数据
代码如下(单条数据查询示例):
func SelectData() {
user := Users{}
// Alias 别名 Get单条查询
engine.Alias("ua").Where("ua.id=1").And("ua.name='Tom'").Get(&user)
fmt.Fprintf(os.Stdout, "姓名:%s, 年龄:%d", user.Name, user.Age)
}
代码如下(多条数据查询示例):
func SelectData() {
users := make([]Users, 0)
// Find多条查询
engine.Asc("id").Find(&users) // Asc正序 Desc 倒序
fmt.Printf("users: %v\n", users)
}
更多查询方法可查阅xorm的官方文档
3. 修改数据
代码如下(示例):
func UpdateData() {
user := User{}
user.Name = "JuLi"
engine.ID(1).Update(&user)
fmt.Printf("user: %v\n", user)
}
4. 删除数据
代码如下(示例):
func DeleteData() {
user := new(User)
d, _ := engine.ID(1).Delete(user)
fmt.Printf("d: %v\n", d)
}
软删除
重新创建表结构
代码如下(示例):
type Users struct {
Id int `xorm:"pk autoincr"`
Name string `xorm:"varchar(25) notnull unique comment('姓名')"`
Age int `xorm:"default 18"`
Create time.Time `xorm:"created"` // 创建时自动填充时间
Update time.Time `xorm:"updated"` // 更新时自动更新时间
DeletedAt time.Time `xorm:"deleted"` // 软删除
}
代码如下(软删除示例):
// 与普通的删除方法完全一样
func DeleteData() {
user := new(Users)
d, _ := engine.ID(1).Delete(user)
fmt.Printf("d: %v\n", d)
}
软删除不会真正的删除数据,而是标记一个删除时间,要真正获得该条记录或真正删除该记录,需要使用Unscoped()
func DeleteData() {
user := new(Users)
d, _ := engine.ID(1).Unscoped().Delete(user)
fmt.Printf("d: %v\n", d)
}
七、完整代码
package main
import (
"fmt"
"os"
"time"
_ "github.com/go-sql-driver/mysql"
"xorm.io/xorm"
)
var engine *xorm.Engine
type Users struct {
Id int `xorm:"pk autoincr"`
Name string `xorm:"varchar(25) notnull unique comment('姓名')"`
Age int `xorm:"default 18"`
Create time.Time `xorm:"created"` // 创建时自动填充时间
Update time.Time `xorm:"updated"` // 更新时自动更新时间
DeletedAt time.Time `xorm:"deleted"` // 软删除
}
func init() {
var err error
// 连接数据库
engine, err = xorm.NewEngine("mysql", "root:mysql8@tcp(192.168.100.111:3306)/test?charset=utf8")
if err != nil {
panic(err)
}
}
// 创建表
func CreateTable() {
engine.Sync2(new(Users)) // 同步数据库结构
}
// 插入数据
func InsertData() {
user := Users{
Name: "Jack",
Age: 15,
}
engine.Insert(&user)
fmt.Printf("user.Id: %v\n", user.Id)
}
// 查询数据
func SelectData() {
user := Users{}
engine.Alias("ua").Where("ua.id=1").And("ua.name='Tom'").Get(&user)
fmt.Fprintf(os.Stdout, "姓名:%s, 年龄:%d", user.Name, user.Age)
// users := make([]Users, 0)
// engine.Asc("id").Find(&users) // Asc正序 Desc 倒序
// fmt.Printf("users: %v\n", users)
// 获取标记删除的记录
}
// 更新数据
func UpdateData() {
user := Users{}
user.Name = "JuLi"
engine.ID(1).Update(&user)
fmt.Printf("user: %v\n", user)
}
// 删除数据
func DeleteData() {
user := new(Users)
d, _ := engine.ID(1).Unscoped().Delete(user)
fmt.Printf("d: %v\n", d)
}
func main() {
engine.ShowSQL() // 显示SQL语句
// CreateTable()
// InsertData()
// SelectData()
// UpdateData()
DeleteData()
defer engine.Close() //延迟关闭数据库
}