使用worm.Model前必须先定义实体类,worm.Model通过实体类来映射数据库字段,并进行数据库操作。
CREATE TABLE `users` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(30) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`passwd` varchar(32) DEFAULT NULL,
`created` datetime DEFAULT NULL,
`updated` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
);
数据库表users对应的实体类的定义如下:
type User struct {
Id int64 `db:"id;autoincr"`
Name string `db:"name"`
Age int64 `db:"age"`
Passwd string `db:"passwd"`
Created time.Time `db:"created;n_update"`
}
func (ent *User) TableName() string {
return "users"
}
func demoModelCUD() {
//插入记录
var user = User{Name:"name1", Age: 21, Created: time.Now()}
id, err := worm.Model(&user).Insert()
if err != nil{
log.Println(err)
return
}
//insert into users set name=?,age=?,passwd=?,created=?
//更新记录
user.Name = "name2"
user.Age = 22
_, err = worm.Model(&user).ID(id).Update()
if err != nil{
log.Println(err)
return
}
//update users set name=?,age=?,passwd=? where id=?
//删除记录
_, err = worm.Model(&User{}).ID(id).Delete()
if err != nil{
log.Println(err)
return
}
//delete from users where id=?
}
说明:
使用worm.Model().Update()
方法来更新数据库时,则worm缺省会更新实体类对应的全部字段。若只希望更新指定的字段,可以使用若Select方法指定需要更新的字段:
func demoModelUpdate() {
var user = User{Name:"name1", Age: 21, Created: time.Now()}
_, err := worm.Model(&user).Select("name", "age").ID(1).Update()
if err != nil{
log.Println(err)
return
}
}
//update users set name=?,age=? where id=?
Select方法虽然能够做到按需更新,但是若库表的字段比较多,这种方法使用起来则比较麻烦,也容易引起错误(更新了不该更新的字段)。worm提供了一种基于编辑状态来更新数据库的方法:
func demoModelUpdateX() {
var user = User{}
md := worm.Model(&user)
md.SetValue(&user.Name, "name2")
md.SetValue(&user.Age, 22)
_, err := md.ID(1).Update()
if err != nil{
log.Println(err)
return
}
}
//update users set name=?,age=? where id=?
worm通过调用Get方法来查询一条数据库记录,在使用Get方法时可以通过Where方法来指定SQL语句的查询条件。
func demoGet() {
var ent User
_, err := worm.Model(&ent).Where("name=?", "name_89").Get()
if err != nil{
log.Println(err)
return
}
log.Println(ent)
}
//select id,name,age,passwd,created from users where name=? limit 1
若查询时使用的字段为ID,则可以采用更为简洁的方式来调用Get方法:
func demoGetByID() {
var ent User
_, err := worm.Model(&ent).ID(1).Get()
if err != nil{
log.Println(err)
return
}
log.Println(ent)
}
//select id,name,age,passwd,created from users where id=? limit 1
worm允许通过Select方法选择特定的字段, 或者使用Omit方法排除特定字段
func demoGetWithSelect() {
//查询指定的字段
user := User{}
worm.Model(&user).Select("id", "name", "age").ID(1).Get()
//select id,name,age from users where id=1 limit 1
user = User{}
worm.Model(&user).Omit("passwd").ID(1).Get()
//select id,name,age,created from users where id=1 limit 1
}
func demoFindUser() {
//find all
users := []User{}
worm.Model(&User{}).Find(&users)
//limit
users = []User{}
worm.Model(&User{}).Limit(5).Offset(1).Find(&users)
//OrderBy
users = []User{}
worm.Model(&User{}).OrderBy("name asc").Find(&users)
}
worm支持链式API,可使用Where, And, Or, ID, In等函数构造查询条件。
func demoFindUser() {
//and
users = []User{}
worm.Model(&User{}).Where("age>?", 0).And("id<?", 10).Find(&users)
//in
users = []User{}
worm.Model(&User{}).Where("age>?", 0).AndIn("id", 1,2).Find(&users)
//like
users = []User{}
worm.Model(&User{}).Where("name like ?", "%name%").Find(&users)
}
func demoModelRows() {
rows, err := worm.Model(&User{}).Where("id>?", 0).Rows()
if err != nil{
log.Println(err)
return
}
defer rows.Close()
for rows.Next(){
var user User
err = rows.Scan(&user)
if err != nil{
log.Println(err)
}
log.Println(user)
}
}
func demoModelCount() {
num, err := worm.Model(&User{}).Where("id>?", 0).Count()
if err != nil {
log.Println(err)
return
}
log.Println(num)
num, err = worm.Model(&User{}).Where("id>?", 0).Count("name")
if err != nil {
log.Println(err)
return
}
log.Println(num)
}
func demoModelExist() {
has, err := worm.Model(&User{}).Where("id=?", 1).Exist()
if err != nil{
log.Println(err)
return
}
log.Println(has)
}
UpdateOrInsert函数根据id判断是Update还是Insert, 若id>0,则调用Update,否则调用Insert。
func demoUpdateOrInsert() {
var user = User{Name:"name2", Age: 22, Created: time.Now()}
_, id, err := worm.Model(&user).UpdateOrInsert(1)
if err != nil{
log.Println(err)
return
}
log.Println(id)
}