初学GO 自己封装的orm 旨在技术学习
使用反射
- tag sql 代表数据库中的字段 不注明 则使用结构体字段
- 数据库表 不区分大小写
type Student struct {
Id int `sql:"id"`
Name string `sql:"name"`
Address string `sql:"address"`
No string
ClassId int `sql:"class_id"`
}
import "github.com/zhuzhiqiang18/go_orm"
只支持MYSQL
db, err := go_orm.Open("root","123456","127.0.0.1",3306,"go_test")
defer db.Close()
db, err := go_orm.Open("root","123456","127.0.0.1",3306,"go_test")
defer db.Close()
if err!=nil {
fmt.Println(err)
return
}
var student model.Student
student.Name="张三"
student.Address="中国"
student.No="123456"
student.ClassId=1
student.Create = time.Now()
student.IsReading =true
res, lastInsertId := db.Save(&student)
fmt.Println("改变行数",res)
fmt.Println("最后插入的id",lastInsertId)
db, _ := go_orm.Open("root","123456","127.0.0.1",3306,"go_test")
defer db.Close()
var student model.Student
student.ClassId=1
res:= db.Delete(&student,"class_id")
fmt.Println("改变行数",res)
db, _ := go_orm.Open("root","123456","127.0.0.1",3306,"go_test")
defer db.Close()
var student model.Student
student.Name="张三"
student.No="00000000"
res:= db.Update(&student,"name")
fmt.Println("改变行数",res)
db, _ := go_orm.Open("root","123456","127.0.0.1",3306,"go_test")
defer db.Close()
//传类型地址
list := make([]model.Student,0)
err := db.FindQuery(&list, "select * from student ")
if err!=nil {
fmt.Println(err)
}else {
for _,stu := range list {
fmt.Println(stu)
}
}
db, _ := go_orm.Open("root","123456","127.0.0.1",3306,"go_test")
defer db.Close()
//传类型地址
list := make([]model.Student,0)
err := db.FindQuery(&list, "select name,no from student ")
if err!=nil {
fmt.Println(err)
}else {
for _,stu := range list {
fmt.Println(stu)
}
}
条件查询使用tag sql字段
db, _ := go_orm.Open("root","123456","127.0.0.1",3306,"go_test")
defer db.Close()
//传类型地址
list := make([]model.Student,0)
err := db.FindQuery(&list, "select name,no from student where name=? ","张三")
if err!=nil {
fmt.Println(err)
}else {
for _,stu := range list {
fmt.Println(stu)
}
}
待更新……
db, _ := go_orm.Open("root","123456","127.0.0.1",3306,"go_test")
defer db.Close()
var student model.Student
student.Name="张三"
student.No="00000000"
tx:=db.Begin()//获取事务
for i:=0;i<10;i++{
re, lastInsertId := tx.Save(&student)
fmt.Println("改变条数",re)
fmt.Println("最后插入主键",lastInsertId)
}
defer func() {
err:=recover()
if err !=nil {
tx.Rollback()//事务回滚
return
}
}()
panic("事务回滚")
tx.Commit()//事务提交
gql 是一个 sql 生成器
//select * from Student where name ="张三" and class_id = 1
var gql go_orm.Gql
gql.Where("name = ? ").Where("class_id = ?").Bind(&model.Student{}).SetPara("张三",1)
//select name,class_id from Student where name ="张三" and class_id = 1
new(go_orm.Gql).Where("name = ? ").Where("class_id = ?").Bind(&model.Student{}).SetPara("张三",1).Fields("name","class_id")
//select name,class_id from Student where name ="张三" and class_id = 1 or class_id = 2
new(go_orm.Gql).Where("name = ? ").Where("class_id = ?").Or("class_id = ?").Bind(&model.Student{}).SetPara("张三",1,2).Fields("name","class_id")
//select name,class_id from Student where name ="张三" and class_id = 1 or class_id = 2 order by id desc
new(go_orm.Gql).Where("name = ? ").Where("class_id = ?").Or("class_id = ?").Order("id desc").Bind(&model.Student{}).SetPara("张三",1,2).Fields("name","class_id")
var gql go_orm.Gql
students := make([]model.Student,0)
//select * from Student where name ="张三" and class_id = 1
gql.Where("name = ? ").Where("class_id = ?").Bind(&students).SetPara("张三",1)
db, _ := go_orm.Open("root","123456","127.0.0.1",3306,"go_test")
defer db.Close()
err := db.FindGql(&gql)
if err!=nil {
fmt.Println(err)
return
}
for _,stu := range students {
fmt.Println(stu)
}
GO中没有NULL 为适配数据库中的NULL 以及JSON的NULL 引入第三方包 gopkg.in/guregu/null.v3 方便数据适配
type Teacher struct {
Id null.Int `sql:"id"`
Name null.String `sql:"name"`
Address null.String `sql:"address"`
No null.String `sql:"no"`
ClassId null.Int `sql:"class_id"`
Create null.Time `sql:"create_date"`
IsReading null.Bool `sql:"is_reading"`
High null.Float `sql:"high"`
Weight null.Float `sql:"weight"`
}
var teacher model.Teacher
teacher.Name = null.NewString("zzq",true)
teacher.Create = null.NewTime(time.Now(),true)
teacher.IsReading = null.NewBool(true,true)
teacher.High = null.NewFloat(160.256,true)
db, _ := go_orm.Open("root","123456","127.0.0.1",3306,"go_test")
defer db.Close()
count,last:= db.Save(&teacher);
fmt.Println("改变条数" , count)
fmt.Println("最后插入" , last)
var gql go_orm.Gql
teachers := make([]model.Teacher,0)
//select * from Student where name ="zzq" and class_id = 1
gql.Where("name = ? ").Where("is_reading = ?").Bind(&teachers).SetPara("zzq",1)
db, _ := go_orm.Open("root","123456","127.0.0.1",3306,"go_test")
db.DBSetting().SetFieldFormat(go_orm.HUMP_UNDERLINE)//驼峰下划线
db.DBSetting().SetTableFormat(go_orm.HUMP_UNDERLINE)//驼峰下划线
defer db.Close()
err := db.FindGql(&gql)
if err != nil{
panic(err)
}
for _,th := range teachers {
fmt.Println(th)
jsonStr,_:=json.Marshal(th)
fmt.Println(string(jsonStr))
//{"Id":1,"Name":"zzq","Address":null,"No":null,"ClassId":null,"Create":"2019-08-20T14:48:12Z","IsReading":true,"High":null,"Weight":null}
db, _ := go_orm.Open("root","123456","127.0.0.1",3306,"go_test")
db.DBSetting().SetFieldFormat(go_orm.HUMP_UNDERLINE)//字段驼峰转下划线
db.DBSetting().SetTableFormat(go_orm.HUMP_UNDERLINE)//表名驼峰转下划线
字段设置驼峰转下划线 如字段tag为空则转下划线方式 如设置tag 则使用tag