https://github.com/wdaglb/korm
golang orm
https://github.com/wdaglb/korm
database go golang mssql mysql orm sqlserver
Last synced: 10 months ago
JSON representation
golang orm
- Host: GitHub
- URL: https://github.com/wdaglb/korm
- Owner: wdaglb
- License: mit
- Created: 2021-08-31T02:49:16.000Z (almost 5 years ago)
- Default Branch: main
- Last Pushed: 2022-10-23T04:55:45.000Z (over 3 years ago)
- Last Synced: 2024-11-23T12:54:05.361Z (over 1 year ago)
- Topics: database, go, golang, mssql, mysql, orm, sqlserver
- Language: Go
- Homepage:
- Size: 59.6 KB
- Stars: 6
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# korm
golang orm, 简单易用的orm, 支持嵌套事务
特点:
1. 事务不需要传tx连接发,只需要在Transaction内部的都会进行事务操作
## 安装
```
go get github.com/wdaglb/korm
go get github.com/go-sql-driver/mysql
```
## 支持数据库
* mysql https://github.com/go-sql-driver/mysql
* mssql https://github.com/denisenkom/go-mssqldb
* ...其它未测
## 连接mysql数据库
```
conn := NewConnect(Config{
DefaultConn: "default",
MaxOpenConns: 100, // 最大打开连接数
MaxIdleConns: 10, // 最大空闲连接数
ConnMaxLifetime: 7200, // 保持连接时间
})
err := conn.AddDb(DbConfig{
Conn: "default",
Driver: "mysql",
Host: "127.0.0.1",
Port: 3306,
User: "root",
Pass: "",
Database: "test",
})
if err != nil {
log.Fatalf("connect fail: %v", err)
}
```
## 连接上下文
数据库的读写操作都依托于Context类
Context内部会自动维护db连接,不需要你自行管理Context实例,每次使用都建议实例一个新的Context
```
// 使用默认数据库
ctx := NewContext()
// 使用指定数据库
ctx := UseContext("test")
```
## 声明模型结构
```
type Test struct {
Id int64 `db:"id"`
User string `db:"user"`
}
```
## 查询一行数据
```
row := &Test{}
if !ctx.Model(&row).Where("Id", 1).Find().Exist {
fmt.Println("记录不存在")
return
}
fmt.Printf("id: %d\n", row.Id)
```
执行的sql
```
SELECT column... FROM test WHERE id=1
```
## 判断数据是否存在
```
if !ctx.Model(Test{}).Where("Id", 1).Exist() {
fmt.Println("记录不存在")
return
}
fmt.Printf("数据存在\n")
```
执行的sql
```
SELECT primaryKey FROM test WHERE id=1
```
## 查询多行数据
```
var rows []Test
if ctx.Model(&rows).Select().Error != nil {
fmt.Println("查询错误")
return
}
fmt.Printf("rows: %v\n", rows)
```
执行的sql
```
SELECT column... FROM test
```
## 忽略字段查询
```
model.IgnoreField("Content")
```
## 创建数据
模型插入会把已经赋值的数据插入的关联表
```
insertData := &Test{
User: "test",
}
if err := ctx.Model(&insertData).Create(); err != nil {
fmt.Println("创建错误")
}
fmt.Printf("insertData: %v\n", insertData)
```
执行的sql
```
INSERT INTO test (`user`) VALUES ('test')
```
## 更新数据
模型更新会把关联已经加载的数据一并更新,未关联的不会更新
```
updateData := &Test{
Id: 1,
User: "test",
}
if err := ctx.Model(&updateData).Update(); err != nil {
fmt.Println("更新错误")
}
fmt.Printf("updateData: %v\n", updateData)
```
执行的sql
```
UPDATE test SET `user`='test' WHERE `id`=1
```
## 删除数据
模型删除会把关联已经加载的数据一并删除,未关联的不会删除
```
if err := ctx.Model(&Test{Id: 1}).Delete(); err != nil {
fmt.Println("删除错误")
}
fmt.Printf("删除成功\n")
```
执行的sql
```
DELETE FROM test WHERE `id`=1
```
## 事务操作
```
ctx.Transaction(func () error {
// 事务逻辑代码
})
```
只需要把需要进行的事务,写到闭包函数里即可,支持嵌套事务
注意:在同一个Context实例里的才会被事务影响
## 一对一关联
在模型定义声明字段
使用*指针标识,默认值为nil,需要With("模型名")手动加载关联数据
未使用*指针标识,则默认自动加载关联数据
```
type Test struct {
Id int64 `db:"id"`
Cate TestCate `pk:"Id" fk:"TestId"`
Cate2 *TestCate `pk:"Id" fk:"TestId"`
}
type TestCate struct {
Id int64 `db:"id"`
Name string `db:"name"`
TestId int `db:"test_id"`
}
```
## 一对多关联
在模型定义声明一个分片字段
```
type Test struct {
Id int64 `db:"id"`
Cates []TestCate `pk:"Id" fk:"TestId"`
}
type TestCate struct {
Id int64 `db:"id"`
Name string `db:"name"`
TestId int `db:"test_id"`
}
```
## 取消关联数据操作同步
Cates关联的数据不会被删除
```
ctx.Model(&deleteData).CancelTogether("Cates").Delete()
```
## License
@ King east, 2021-now
Released under the [MIT License](https://github.com/wdaglb/korm/blob/main/LICENSE)