Skip to content

Commit

Permalink
feat: add test and update readme
Browse files Browse the repository at this point in the history
  • Loading branch information
lujin committed Feb 7, 2023
1 parent 782852d commit 66645f0
Show file tree
Hide file tree
Showing 3 changed files with 209 additions and 18 deletions.
187 changes: 186 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,186 @@
# gormx
# gormx

`gormx` 是对 `gorm` 的高阶函数操作的简单封装

## 使用

- 初始化

调用 `New` 实例化一个新的数据库对象,自定义的参数通过 `Config` 传入

```go
conf := &Config{
Dialector: postgres.Open(dsn), //使用 postgres 驱动
MaxIdleConn: 10,
MaxOpenConn: 10,
MaxLifetime: 1000,
Debug: false,
}
db, _ := New(conf, opts...)

// 获取原始 gorm 对象
// gormdb := db.DB()
```

- 高阶函数构建

```go
func WithName(name string) Option {
return func(db *gorm.DB) *gorm.DB {
return db.Where("name=?", name)
}
}
```

- 创建记录

```go
// 创建单条记录
user := User{
Nickname: "hello",
}
db.Insert(&user)

// 创建多条记录
var users []User
for i := 0; i < 2; i++ {
users = append(users, User{
Nickname: fmt.Sprintf("hello %d", i),
Age: int64(i),
})
}
db.Insert(users)
```

- 查询单条记录

```go
var user = User{
Id: 1,
}
// model 中的 ID 需要是主键
db.FindOne(&user)
//SQL: select * from test_users where id=1;

// 带有 where 条件
func WithName(name string) Option {
return func(db *gorm.DB) *gorm.DB {
return db.Where("name=?", name)
}
}

var user User
db.FindOne(&user, WithName("hello"))
//SQL: select * from test_users where name='hello';
```

- 查询多条记录

```go
var user []User
db.FindMany(&user, Pagination(1, 2))
//SQL: select * from test_users limit 2;
```

- 更新记录

```go
// 更新不存在的记录,会返回 `ErrNoRowsAffected`,注意检查错误
err = db.Model(&User{Id: -1}).Update("nickname", "hello world")

// 更新单字段
err = db.Model(&User{Id: 1}).Update("nickname", "hello world")

// 使用struct更新多字段
err = db.Updates(&User{
Id: 1,
Nickname: "hello struct",
Age: 133,
})

// 使用 map 更新多字段
err = db.Model(&User{Id: 1}).Updates(map[string]interface{}{
"nickname": "hello map",
"age": "133",
})
```

- 删除记录

```go
user := User{Id: 1}
err = db.Delete(&user)
```

- 检查记录是否存在

```go
exists, err := db.Exists(&User{
Id: 1,
})
// SQL: select exists(select * from test_users where id=1 limit 1);
```

- 获取记录数

```go
total, err := db.Model(&User{}).Count()
// SQL: SELECT count(*) FROM test_users;
```

- SQL 执行

```go
// 建表
db.Exec("create table test_users (id serial primary key not null, nickname varchar(64) not null, age integer default 0);")

```

- SQL 查询

```go
var (
query = `select * from test_users where id=?`
args = []interface{}{1}
user User
)

// 执行查询 SQL 后再将数据映射到model 中
db.Raw(query, args...).FindOne(&user)

var myUser struct {
Id int64
Nickname string
}
// 执行 SQL 后将数据映射到任意自定义对象
db.Raw(query, args...).Scan(&myUser)
```

- 上下文Context设置

```go
// 请求之前都需要设置 Context,否则无法追踪调用链路
db.WithContext(ctx).FindOne(...)
```

- 事务

```go
err := db.WithContext(ctx).Tx(func(tx *db) error {
if err := tx.Model(&User{Id: 1}).Update("nickname", "hello tx"); err != nil {
return err
}
user := User{
Nickname: "hello tx insert",
Age: 133,
}
if err := tx.Insert(&user); err != nil {
return err
}
return nil
})
```

## 最后

`gorm`对简单 `SQL` 操作比较好用,复杂的查询还得使用原生 `SQL`,所以不能满足使用的时候,取出 `gorm` 对象自己操作 `SQL` 就行了
6 changes: 6 additions & 0 deletions db.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,12 @@ func New(cfg *Config, opts ...gorm.Option) (*Gormx, error) {
}, nil
}

func NewWithDB(db *gorm.DB) *Gormx {
return &Gormx{
db: db,
}
}

func (s *Gormx) DB() *gorm.DB {
return s.db
}
Expand Down
34 changes: 17 additions & 17 deletions db_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ import (
"gorm.io/gorm"
)

func TestStoreTestSuite(t *testing.T) {
suite.Run(t, new(StoreTestSuite))
func TestGormxTestSuite(t *testing.T) {
suite.Run(t, new(GormxTestSuite))
}

type User struct {
Expand All @@ -23,13 +23,13 @@ func (User) TableName() string {
return "test_users"
}

type StoreTestSuite struct {
type GormxTestSuite struct {
suite.Suite

db *Gormx
}

func (suite *StoreTestSuite) SetupTest() {
func (suite *GormxTestSuite) SetupTest() {
conf := &Config{
Dialector: nil, //fill driver
MaxIdleConn: 10,
Expand All @@ -43,11 +43,11 @@ func (suite *StoreTestSuite) SetupTest() {
suite.initUsers()
}

func (suite *StoreTestSuite) TearDownTest() {
func (suite *GormxTestSuite) TearDownTest() {
suite.db.Exec("drop table test_users;")
}

func (suite *StoreTestSuite) initUsers() {
func (suite *GormxTestSuite) initUsers() {
suite.db.Exec("create table test_users (id serial primary key not null, nickname varchar(64) not null, age integer default 0);")
var users []User
for i := 0; i < 2; i++ {
Expand All @@ -60,7 +60,7 @@ func (suite *StoreTestSuite) initUsers() {
suite.Assert().Nil(suite.db.Insert(users))
}

func (suite *StoreTestSuite) TestFindOne() {
func (suite *GormxTestSuite) TestFindOne() {
var user = User{
Id: 1,
}
Expand All @@ -70,7 +70,7 @@ func (suite *StoreTestSuite) TestFindOne() {
}
}

func (suite *StoreTestSuite) TestExists() {
func (suite *GormxTestSuite) TestExists() {
var (
exists bool
err error
Expand All @@ -90,7 +90,7 @@ func (suite *StoreTestSuite) TestExists() {
}
}

func (suite *StoreTestSuite) TestInsert() {
func (suite *GormxTestSuite) TestInsert() {
user := User{
Nickname: "hello",
}
Expand All @@ -100,7 +100,7 @@ func (suite *StoreTestSuite) TestInsert() {
}
}

func (suite *StoreTestSuite) TestFindMany() {
func (suite *GormxTestSuite) TestFindMany() {
var user []User
err := suite.db.FindMany(&user, Pagination(1, 2))
if !suite.Assert().Nil(err) {
Expand All @@ -110,7 +110,7 @@ func (suite *StoreTestSuite) TestFindMany() {
suite.Equal(2, len(user))
}

func (suite *StoreTestSuite) TestPluck() {
func (suite *GormxTestSuite) TestPluck() {
var ids []int64
err := suite.db.Model(&User{}).Pluck("id", &ids, Pagination(1, 2))
if !suite.Assert().Nil(err) {
Expand All @@ -120,7 +120,7 @@ func (suite *StoreTestSuite) TestPluck() {
suite.Equal([]int64{1, 2}, ids)
}

func (suite *StoreTestSuite) TestCount() {
func (suite *GormxTestSuite) TestCount() {
total, err := suite.db.Model(&User{}).Count()
if !suite.Assert().Nil(err) {
return
Expand All @@ -129,7 +129,7 @@ func (suite *StoreTestSuite) TestCount() {
suite.EqualValues(2, total)
}

func (suite *StoreTestSuite) TestUpdate() {
func (suite *GormxTestSuite) TestUpdate() {
err := suite.db.Model(&User{Id: -1}).Update("nickname", "hello world")
suite.ErrorIs(err, ErrNoRowsAffected)

Expand All @@ -143,7 +143,7 @@ func (suite *StoreTestSuite) TestUpdate() {
}
}

func (suite *StoreTestSuite) TestUpdates() {
func (suite *GormxTestSuite) TestUpdates() {
err := suite.db.Updates(&User{
Id: 1,
Nickname: "hello struct",
Expand Down Expand Up @@ -187,15 +187,15 @@ func (suite *StoreTestSuite) TestUpdates() {
suite.Assert().ErrorIs(err, ErrNoRowsAffected)
}

func (suite *StoreTestSuite) TestDelete() {
func (suite *GormxTestSuite) TestDelete() {
user := User{Id: 1}
err := suite.db.Delete(&user)
if suite.Nil(err) {
err = suite.db.FindOne(&user)
suite.ErrorIs(err, gorm.ErrRecordNotFound)
}
}
func (suite *StoreTestSuite) TestRaw() {
func (suite *GormxTestSuite) TestRaw() {
var (
query = `select * from test_users where id=?`
args = []interface{}{1}
Expand All @@ -222,7 +222,7 @@ func (suite *StoreTestSuite) TestRaw() {
}
}

func (suite *StoreTestSuite) TestTx() {
func (suite *GormxTestSuite) TestTx() {
var id int64
err := suite.db.WithContext(context.Background()).Tx(func(tx *Gormx) error {
if err := tx.Model(&User{Id: 1}).Update("nickname", "hello tx"); err != nil {
Expand Down

0 comments on commit 66645f0

Please sign in to comment.