https://blog.csdn.net/aminic/article/details/42029653
package main
import (
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
"github.com/go-xorm/xorm"
)
type ModelBase struct {
Id int64
Name string
}
type Person struct {
Id int64
Name string
}
type Department struct {
Id int64
Name string
}
type DepartmentTotalPrice struct {
Department
}
type DepartmentPerson struct {
Id int64
Department Department `xorm:"department_id bigint"`
Person Person `xorm:"person_id bigint"`
}
type Order struct {
Id int64
Person Person `xorm:"person_id bigint"`
Title string
TotalPrice float64
}
type OrderDetail struct {
Id int64
Order Order `xorm:"order_id bigint"`
Name string
Number int64
Price float64
}
var x *xorm.Engine
func init() {
var err error
x, err = xorm.NewEngine("mysql", "root:12345678@/test?charset=utf8")
x.ShowSQL = true
if err != nil {
log.Fatalf("Fail to create XORM engine : %v", err)
}
if err = x.Sync(
new(Person),
new(Department),
new(DepartmentPerson),
new(Order), new(OrderDetail)); err != nil {
log.Fatalf("Fail to sync struct to table schema : %v", err)
} else {
fmt.Println("Succ sync struct to table schema")
}
}
func createPerson() {
fmt.Println("++++++++++++++++++++ Create Person")
persons := []Person{
Person{Name: "lucy"},
Person{Name: "maven"},
Person{Name: "tom"},
Person{Name: "kim"},
}
var (
num int64
err error
)
if num, err = x.Insert(persons); err != nil {
log.Fatalf("Fail to Insert Persons : %v", err)
}
fmt.Printf("Succ to insert person number : %d\n", num)
}
func createDepartment() {
fmt.Println("++++++++++++++++++++ Create Department")
departs := []Department{
Department{Name: "Basic Processing"},
Department{Name: "Person Management"},
}
var (
num int64
err error
)
if num, err = x.Insert(departs); err != nil {
log.Fatalf("Fail to Insert Department : %v", err)
}
fmt.Printf("Succ to insert Department number : %d\n", num)
}
func getDeparts() (departs []Department, err error) {
////////get department from DB
departs = make([]Department, 0)
if err = x.Find(&departs); err != nil {
return nil, err
}
fmt.Printf("Succ to get Department number : %d\n", len(departs))
for i, d := range departs {
fmt.Printf("DataIndex : %d DataContent : %#v\n", i, d)
}
return departs, nil
}
func getPersons() (persons []Person, err error) {
////////get person from DB
persons = make([]Person, 0)
if err = x.Find(&persons); err != nil {
return nil, err
}
fmt.Printf("Succ to get Person number : %d\n", len(persons))
for i, d := range persons {
fmt.Printf("DataIndex : %d DataContent : %#v\n", i, d)
}
return persons, nil
}
func createDepartmentPersonRelation() {
fmt.Println("++++++++++++++++++++ Create Department Person Relation")
var err error
var departs []Department
if departs, err = getDeparts(); err != nil {
log.Fatalf("Fail to Get Department : %v \n", err)
}
var persons []Person
if persons, err = getPersons(); err != nil {
log.Fatalf("Fail to Get Person : %v \n", err)
}
////////create relation to DB
relations := []DepartmentPerson{
DepartmentPerson{Department: departs[0], Person: persons[0]},
DepartmentPerson{Department: departs[0], Person: persons[1]},
DepartmentPerson{Department: departs[1], Person: persons[2]},
DepartmentPerson{Department: departs[1], Person: persons[3]},
}
var num int64
if num, err = x.Insert(relations); err != nil {
log.Fatalf("Fail to insert Department Person relation : %#v \n", err)
}
fmt.Printf("Succ to insert Department Person relation number : %d\n", num)
}
func createOrder() {
fmt.Println("++++++++++++++++++++ Create Person Order")
//get persons
var (
err error
num int64
persons []Person
)
if persons, err = getPersons(); err != nil {
log.Fatalf("Fail to Get Person : %v \n", err)
}
//create order and details
for _, p := range persons {
//create order to DB
for i := int64(1); i < 3; i++ {
//using transction
s := x.NewSession()
err = s.Begin()
o := Order{
Person: p,
Title: fmt.Sprintf("order %d for person %s", i, p.Name),
}
if num, err = s.Insert(&o); err != nil {
s.Rollback()
log.Fatalf("Fail to %s save ", o.Title)
}
fmt.Printf("Succ to %s save . order id is : %d \n", o.Title, o.Id)
////////////
details := []OrderDetail{
OrderDetail{
Order: o,
Name: fmt.Sprintf("detail %d _ %s", i, o.Title),
Number: i,
Price: 11.0,
},
OrderDetail{
Order: o,
Name: fmt.Sprintf("detail %d _ %s", i+1, o.Title),
Number: i + 1,
Price: 12.0,
},
}
if num, err = s.InsertMulti(&details); err != nil {
s.Rollback()
log.Fatalf("Fail to detail for %s save ", o.Title)
}
s.Commit()
fmt.Printf("Succ to detail for %s save number : %d\n", o.Title, num)
}
}
}
func getOneDepartmentPersonRelationByID() {
var (
err error
has bool
)
//good run
relation1 := DepartmentPerson{Id: 5}
if has, err = x.Get(&relation1); err != nil {
log.Fatalf("Find Department Person Relation Error : %v", err)
}
fmt.Printf("find one : %d data content : %#v\n", has, relation1)
//////////////////////////////////////
//good run
var relation2 DepartmentPerson
if has, err = x.Id(5).Get(&relation2); err != nil {
log.Fatalf("Find Department Person Relation Error : %v", err)
}
fmt.Printf("find one : %d data content : %#v\n", has, relation2)
}
func getBasicProcessingDepartmentPersonMavenOrderDetails() {
var (
err error
details []OrderDetail
)
fmt.Println("++++++++++++++++ get details by order title")
//get details by order title
if err = x.Join("INNER", "order", "order.id=order_detail.order_id").
Where("order.title=?", "order 1 for person maven").
Find(&details); err != nil {
log.Fatalf("Find order detail by order title Error : %v", err)
}
fmt.Printf("find order detail number : %d\n", len(details))
for i, d := range details {
fmt.Printf("index : %d data content : %#v\n", i, d)
}
//////////////////////////
fmt.Println("++++++++++++++++ get details for person and department condition")
//get details for person and department condition
if err = x.Join("INNER", "order", "order.id=order_detail.order_id").
Join("INNER", "person", "person.id=order.person_id").
Join("LEFT", "department_person", "department_person.person_id=order.person_id").
Join("LEFT", "department", "department.id=department_person.department_id").
Where("department.name=?", "Basic Processing").
And("person.name=?", "maven").
Find(&details); err != nil {
log.Fatalf("Find order detail by order title Error : %v", err)
}
fmt.Printf("find order detail number : %d\n", len(details))
for i, d := range details {
fmt.Printf("index : %d data content : %#v\n", i, d)
}
}
func getOrderTotalPrice() {
fmt.Println("++++++++++++++++++++ get order total price using Iterate method")
var (
err error
orders_UsingIterate []*Order
)
if err = x.Iterate(new(Order), func(i int, bean interface{}) error {
o := bean.(*Order)
var details []OrderDetail
if err := x.Where("order_id=?", o.Id).Find(&details); err == nil {
var totalPrice float64 = 0
for _, d := range details {
totalPrice += (float64(d.Number) * d.Price)
}
o.TotalPrice = totalPrice
orders_UsingIterate = append(orders_UsingIterate, o)
}
return nil
}); err != nil {
log.Fatalf("Find order total price Error using iterate method : %v", err)
}
fmt.Printf("order count : %d\n", len(orders_UsingIterate))
for i, o := range orders_UsingIterate {
fmt.Printf("index : %d data content : %#v\n", i, o)
}
/////////////////////////////////////////////////////////
fmt.Println("++++++++++++++++++++ get order total price using rows method")
var rows *xorm.Rows
if rows, err = x.Rows(new(Order)); err != nil {
log.Fatalf("Find order total price Error using rows method : %v", err)
}
defer rows.Close()
var o Order
var orders_UsingRows []Order
for rows.Next() {
if err = rows.Scan(&o); err != nil {
fmt.Printf("rows scan in order error : %v\n", err)
}
var details []OrderDetail
if err := x.Where("order_id=?", o.Id).Find(&details); err == nil {
var totalPrice float64 = 0
for _, d := range details {
totalPrice += (float64(d.Number) * d.Price)
}
o.TotalPrice = totalPrice
orders_UsingRows = append(orders_UsingRows, o)
}
}
fmt.Printf("order count : %d\n", len(orders_UsingRows))
for i, o := range orders_UsingRows {
fmt.Printf("index : %d data content : %#v\n", i, o)
}
}
func main() {
createPerson()
createDepartment()
createDepartmentPersonRelation()
createOrder()
getOneDepartmentPersonRelationByID()
getBasicProcessingDepartmentPersonMavenOrderDetails()
getOrderTotalPrice()
}
分享到:
相关推荐
manual-zh-CN, Xorm操作指南中文版(gitbook格式)
xorm是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作非常简便。xorm的目标并不是让你完全不去学习SQL,我 们认为SQL并不会为ORM所替代,但是ORM将可以解决绝大部分的简单SQL需求。xorm支持两种风格的混用。
今天小编就为大家分享一篇关于使用go xorm来操作mysql的方法实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
go-xorm 文档pdf ,根据20190802github上文档转换, 文档源文件地址https://github.com/go-xorm/manual-zh-CN.git
本库的相关定制功能是为了解决更简单的进行复杂SQL调用和某些特殊业务需求场景而开发的。本定制版ORM相关核心功能和原版保持一致,会跟随原版xorm更新。定制功能采用针对原版的弱侵入性代码实现。特性支持Struct和...
xorm, 面向 Go,支持 mysql,postgres,tidb,sqlite3,sql,oracle的简单和强大的ORM 中文Xorm是一个简单而强大的Go 。 特性结构 <->-表映射支持可以链接的api事务支持ORM和原始SQL操作支持同步数据库架构支持查询...
golang实战使用gin+xorm搭建go语言web框架详解.rar
Xorm适配器 XORM适配器是适配器 。 使用此库,Casbin可以从Xorm支持的数据库中加载策略或将策略保存到该数据库。 基于,当前受支持的数据库为: MySQL的: MyMysql的: Postgres: Tidb: SQLite: : Oracle: ...
golang实战使用gin+xorm搭建go语言web框架详解.pdf
当前,我们可以为所有操作支持tidb。 如何使用 就像xorm的其他支持一样,但是您应该导入三个软件包: import ( _ "github.com/pingcap/tidb" _ "github.com/go-xorm/tidb" "github.com/go-xorm/xorm" ) //The ...
GO语言实现简单登录注册修改密码+... 通过它可以使数据库操作非常简便。xorm的目标并不是让你完全不去学习SQL,我们认为SQL并不会为ORM所替代,但是ORM将可以解决绝大部分的简单SQL需求。xorm支持两种风格的混用。
说明 此项目只是用作熟悉的gin和xorm,所以如果出现使用错误或其他错误,还请提问题说明,看到我会及时...3,如果执行了go install ,也可以通过二进制执行./gin-xorm-admin ,可以在后面跟上参数--port可以修改端口
SQL构建器 软件包构建器是用于Go和XORM的轻量级且快速SQL构建器。 确保已安装Go 1.8+,然后: go get xorm.io/builder插入sql , args , err := builder . Insert ( Eq { "c" : 1 , "d" : 2 }). Into ( "table1" ). ...
Xorm网络缓存 xorm.io的网络缓存
基于beego框架和xorm做的数据库定时备份系统.zip基于beego框架和xorm做的数据库定时备份系统.zip基于beego框架和xorm做的数据库定时备份系统.zip基于beego框架和xorm做的数据库定时备份系统.zip
Xorm网站 Xorm官方网站的开源项目。 执照 Xorm Web已获得BSD许可。 有关完整的许可证文本,请参阅文件。
Xorm reverse是go语言golang数据库转换为代码的命令行工具,能够根据数据库自动反向生成go代码,根据数据表结构创建对应的 struct 模型,非常方便ORM的使用
xorm是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作非常简便。