Skip to content

CenGinHong/tiny-ORM

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

17 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

tiny-ORM

简易ORM框架,目前仅实现了基于sqlite3的数据库支持

go get -u github.com/CenGinHong/tiny-ORM

CRUD

插入

import (
"fmt"
"github.com/CenGinHong/tiny-ORM"
)

type User struct {
Name string `tiny-ORM:"PRIMARY KEY"`
Age  int
}

var (
user1 = &User{"Tom", 18}
user2 = &User{"Sam", 25}
user3 = &User{"Jack", 25}
)

func main() {
engine, err := tiny-ORM.NewEngine("sqlite3", "tiny.db")
if err != nil {
fmt.Println(err)
return
}
defer engine.Close()
session := engine.NewSession()
err = session.Model(&User{}).CreateTable()
if err != nil {
fmt.Println(err)
return
}
	_, err = session.Model(&User{}).Insert(user1, user2)
	if err != nil {
		fmt.Println(err)
		return
	}
}

查询

import (
"fmt"
"github.com/CenGinHong/tiny-ORM"
)

type User struct {
Name string `tiny-ORM:"PRIMARY KEY"`
Age  int
}

var (
user1 = &User{"Tom", 18}
user2 = &User{"Sam", 25}
user3 = &User{"Jack", 25}
user4 = &User{"John", 32}
)

func main() {
engine, err := tiny-ORM.NewEngine("sqlite3", "tiny.db")
if err != nil {
fmt.Println(err)
return
}
defer engine.Close()
s := engine.NewSession().Model(&User{})
err = s.DropTable()
if err != nil {
fmt.Println(err)
return
}
	err = s.CreateTable()
	if err != nil {
		fmt.Println(err)
		return
	}
	_, err = s.Insert(user1, user2, user3, user4)
	if err != nil {
		fmt.Println(err)
		return
	}
	u := &User{}
	// 仅查询一条数据
	err = s.Where("Age > ?", 20).First(u)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(u)
	// 条件查询
	var users []User
	if err = s.Where("Age > ?", 20).OrderBy("Age").Limit(2).Find(&users); err != nil {
		fmt.Println(err)
		return
	}
	for _, user := range users {
		fmt.Println(user)
	}
}

更新

import (
"fmt"
"github.com/CenGinHong/tiny-ORM"
)

type User struct {
Name string `tiny-ORM:"PRIMARY KEY"`
Age  int
}

var (
user1 = &User{"Tom", 18}
user2 = &User{"Sam", 25}
user3 = &User{"Jack", 25}
)

func main() {
engine, err := tiny-ORM.NewEngine("sqlite3", "tiny.db")
if err != nil {
fmt.Println(err)
return
}
defer engine.Close()
s := engine.NewSession().Model(&User{})
err = s.DropTable()
if err != nil {
fmt.Println(err)
return
}
	err = s.CreateTable()
	if err != nil {

		return
	}
	_, err = s.Insert(user1)
	if err != nil {
		fmt.Println(err)
		return
	}
	users := make([]User, 0)
	if err = s.Find(&users); err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println("after insert:")
	for _, user := range users {
		fmt.Println(user)
	}
	_, err = s.Where("Name = ?", "Tom").Update(map[string]interface{}{
		"Age": 30,
	})
	if err != nil {
		fmt.Println(err)
		return
	}
	users = make([]User, 0)
	if err = s.Find(&users); err != nil {
		fmt.Println(err)
		return
	}
    fmt.Println("after update:")
	for _, user := range users {
		fmt.Println(user)
	}
}

删除

import (
"fmt"
"github.com/CenGinHong/tiny-ORM"
)

type User struct {
Name string `tiny-ORM:"PRIMARY KEY"`
Age  int
}

var (
user1 = &User{"Tom", 18}
user2 = &User{"Sam", 25}
user3 = &User{"Jack", 25}
)

func main() {
engine, err := tiny-ORM.NewEngine("sqlite3", "tiny.db")
if err != nil {
fmt.Println(err)
return
}
defer engine.Close()
s := engine.NewSession().Model(&User{})
err = s.DropTable()
if err != nil {
fmt.Println(err)
return
}
	err = s.CreateTable()
	if err != nil {

		return
	}
	_, err = s.Insert(user1, user2)
	if err != nil {
		fmt.Println(err)
		return
	}
	users := make([]User, 0)
	if err = s.Find(&users); err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println("after insert:")
	for _, user := range users {
		fmt.Println(user)
	}
	_, err = s.Where("Name = ?", "Tom").Delete()
	if err != nil {
		fmt.Println(err)
		return
	}
	users = make([]User, 0)
	if err = s.Find(&users); err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println("after delete:")
	for _, user := range users {
		fmt.Println(user)
	}
}

计数

import (
"fmt"
"github.com/CenGinHong/tiny-ORM"
)

type User struct {
Name string `tiny-ORM:"PRIMARY KEY"`
Age  int
}

var (
user1 = &User{"Tom", 18}
user2 = &User{"Sam", 25}
user3 = &User{"Jack", 25}
)

func main() {
engine, err := tiny-ORM.NewEngine("sqlite3", "tiny.db")
if err != nil {
fmt.Println(err)
return
}
defer engine.Close()
s := engine.NewSession().Model(&User{})
err = s.DropTable()
if err != nil {
fmt.Println(err)
return
}
	err = s.CreateTable()
	if err != nil {

		return
	}
	_, err = s.Insert(user1, user2)
	if err != nil {
		fmt.Println(err)
		return
	}
	count, err := s.Count()
	if err != nil {
		return
	}
	fmt.Println(count);
}

HOOK

以表结构作为receiver添加相对应的方法即可进行相应的回调.

目前支持的Hook埋点如下

BeforeQuery 
AfterQuery  
BeforeUpdate 
AfterUpdate 
BeforeDelete
AfterDelete 
BeforeInsert
AfterInsert
import (
"fmt"
"github.com/CenGinHong/tiny-ORM"
"github.com/CenGinHong/tiny-ORM/log"
"github.com/CenGinHong/tiny-ORM/session"
)

type Account struct {
ID       int `tiny-ORM:"PRIMARY KEY"`
Password string
}

func (account *Account) BeforeInsert(s *session.Session) error {
log.Info("before inert", account)
account.ID += 1000
return nil
}

func (account *Account) AfterQuery(s *session.Session) error {
log.Info("after query", account)
account.Password = "******"
return nil
}

func main() {
engine, err := tiny-ORM.NewEngine("sqlite3", "tiny.db")
if err != nil {
fmt.Println(err)
return
}
defer engine.Close()
s := engine.NewSession().Model(&Account{})
_ = s.DropTable()
_ = s.CreateTable()
a := &Account{1, "123456"}
fmt.Println("before insert")
fmt.Println(a)
	_, _ = s.Insert(a)
	u := &Account{}
	err = s.First(u)
	fmt.Println("after insert")
	fmt.Println(u)
}

事务

使用func (e *Engine) Transaction(f TxFunc) (result interface{}, err error)进行事务的操作,用户将所有的操作放入回调函数TxFunc在,如果在该回调函数中没有返回err,则会被commit,否则将会rollback

import (
"errors"
"fmt"
"github.com/CenGinHong/tiny-ORM"
"github.com/CenGinHong/tiny-ORM/session"
)

type User struct {
Name string `tiny-ORM:"PRIMARY KEY"`
Age  int
}

func main() {
engine, err := tiny-ORM.NewEngine("sqlite3", "tiny.db")
if err != nil {
fmt.Println(err)
return
}
defer engine.Close()
_ = engine.NewSession().Model(&User{}).DropTable()
_, err = engine.Transaction(func (s *session.Session) (result interface{}, err error) {
if err = s.Model(&User{}).CreateTable(); err != nil {
return nil, err
}
result, err = s.Insert(&User{"Tom", 18})
		return nil, err
	})
}

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages