作用: Golang的一个简洁的操作关系型数据库的ORM库,具有简单和熟悉的接口
特点:
- 简单和熟悉的接口
- 良好的测试,在生产环境运行了两年
- 具备时间的内置日志
安装
go get github.com/azer/crud
初始化
import (
"github.com/azer/crud"
_ "github.com/go-sql-driver/mysql"
)
var DB *crud.DB
func init () {
var err error
DB, err = crud.Connect("mysql", os.Getenv("DATABASE_URL"))
err = DB.Ping()
}
复制代码
定义
type User struct {
Id int `sql:"auto-increment primary-key"`
FirstName string
LastName string
ProfileId int
}
type Profile struct {
Id int `sql:"auto-increment primary-key"`
Bio string `sql:"text"`
}
复制代码
CURD
能够实现列的自动转化,比如FirstName
(驼峰)转换成first_name
(蛇形),仍然可以选择定制的名称
type Post struct {
Slug string `sql:"name=slug_id varchar(255) primary-key required"`
}
复制代码
如果没有主键,CURD
将寻找一个名称为Id
,并且类型为整形的字段,将其设置为自动增长的主键
Create & Drop Tables
CreateTables
需要结构体的列表,并且确保在数据库中是存在的
err := DB.CreateTables(User{}, Profile{})
err := DB.DropTables(User{}, Profile{})
复制代码
Reset Tables
删除并且重建表
err := DB.ResetTables(User{}, Profile{})
复制代码
SQL选项
CURD
试着分辨出最优的配置,同时让我们能够自由选择。
type Tweet struct {
Text string `sql:"varchar(140) required name=tweet"`
}
复制代码
上面的限制项是文本,不超过140个字符,不为空,改变name
字段为tweet
以下为一个列表
Types: int, bigint, varchar, text, date, time, timestamp
auto-increment / autoincrement / auto_increment
primary-key / primarykey / primary_key
required
default='?'
name=?
复制代码
如果想设置结构体中某一项被忽视,直接设置-
type Foo struct {
IgnoreMe string `sql:"-"`
}
复制代码
Create
创建
user := &User{1, "Foo", "Bar", 1}
err := DB.Create(user)
复制代码
CreateAndRead
创建和读取
user := User{
FirstName:"Foo"
}
err := DB.CreateAndRead(&user)
user.Id
// => 123
复制代码
Read
1.读一行
user := &User{}
err := DB.Read(user, "SELECT * FROM users WHERE id = ?", 1)
// => SELECT * FROM users WHERE id = 1
fmt.Println(user.Name)
// => Foo
复制代码
2.读多行
users := []*User{}
err := DB.Read(&users)
// => SELECT * FROM users
fmt.Println(len(users))
// => 10
复制代码
- 取出特定列
names := []string{}
err := DB.Read(&names, "SELECT name FROM users")
name := ""
err := DB.Read(&name, "SELECT name FROM users WHERE id=1")
totalUsers := 0
err := DB.Read(&totalUsers, "SELECT COUNT(id) FROM users"
复制代码
Update
更新满足条件的列,如果没有匹配的数据,则返回sql.ErrNoRows
user := &User{}
err := DB.Read(user, "SELECT * FROM users WHERE id = ?", 1)
user.Name = "Yolo"
err := DB.Update(user)
复制代码
Delete
删除满足条件的列,如果没有匹配的数据,则返回sql.ErrNoRows
err := DB.Delete(&User{
Id: 1
})
复制代码
Transactions
使用crud.DB
的Begin
方法开始一个事务,每一个事务都提供下面的方法。
- Commit
- Rollback
- Exec
- Query
- Create
- Read
- Update
- Delete
tx, err := DB.Begin()
err := tx.Create(&User{
Name: "yolo"
})
err := tx.Delete(&User{
Id: 123
})
err := tx.Commit()
复制代码
Logs
使用Log=curd
能够看到日志信息
LOG=crud go run myapp.go
复制代码
Custom Queries
result, err := DB.Query("DROP DATABASE yolo") // or .Exec
复制代码