`

XORM 的复杂操作

阅读更多
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()
}
分享到:
评论

相关推荐

    go-xorm 文档pdf ,根据20190802github上文档转换

    xorm是一个简单的Go语言ORM库,它使得数据库操作变得非常简便。xorm并不是要完全取代SQL的学习,而是解决大部分简单SQL需求。...通过灵活的API和自动同步数据库结构的功能,它可以大大简化数据库操作的复杂性。

    使用go xorm来操作mysql的方法实例

    在Golang中,进行数据库操作时,XORM是一个流行的ORM(对象关系映射)库,它简化了与MySQL等数据库的交互。...在实际开发中,可以根据具体需求调整连接池配置、添加更多的数据结构和数据库操作,以满足复杂的应用场景。

    xorm:xorm是一个简单而强大的Go语言ORM库,通过它可以使数据库操作非常正确。本库是基于原版xorm的定制增强版本,为xorm提供类似ibatis的配置文件及动态SQL支持,支持AcitveRecord操作

    本库的相关定制功能是为了解决更简单的进行复杂SQL调用和某些特殊业务需求场景而开发的。本定制版ORM相关核心功能和原版保持一致,会跟随原版xorm更新。定制功能采用针对原版的弱侵入性代码实现。特性支持Struct和...

    管理系统系列--基于Revel,Jquery, Xorm开发的内容管理系统.zip

    Xorm提供了ORM(对象关系映射)功能,允许开发者使用Go语言的对象来操作数据库,降低了数据库操作的复杂性。 **内容管理系统** 内容管理系统(CMS)是一种软件应用,用于创建、管理和发布数字内容,如文章、图片、...

    Go-xorm是一个简单而强大的Go语言ORM库

    总的来说,Go-xorm作为Go语言的ORM库,通过简洁的API设计和强大的功能,极大地降低了数据库操作的复杂性,提高了开发效率,是Go项目中进行数据库操作的得力助手。如果你在使用过程中遇到问题,可以通过阅读官方文档...

    基于go-zero、xorm实现的云盘文件存储系统.zip

    它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go...

    GoCMS, 基于Revel,Jquery, Xorm开发的内容管理系统.zip

    通过Xorm,开发者可以更高效地处理数据模型,减少与数据库交互的复杂性,提高代码的可读性和可维护性。 GoCMS的开源性质意味着它的源代码对公众开放,开发者可以查看、学习甚至修改源码来满足特定需求。这种开放性...

    管理系统系列--一个go、echo、xorm、vue typescript vite 开发的快速、简洁、美观、前后端.zip

    综合来看,这个项目运用了现代Web开发的主流技术,结合Go的后端性能、Echo的微服务架构、XORM的数据库操作便捷性、Vue的前端渲染能力、TypeScript的类型安全以及Vite的快速构建,打造了一个高效且易于维护的管理平台...

    基于go-zero,xorm实现的轻量级云盘.zip

    基于go-zero,xorm实现的轻量级云盘 Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下...

    盘古数据库适配.zip

    1. **集成XORM操作数据库**: XORM是一个轻量级的Golang ORM(对象关系映射)库,它允许开发者用面向对象的方式来操作数据库。通过将XORM集成到盘古数据库中,可以简化SQL编写,提高开发效率,同时提供了事务处理、...

    数据库数据分片(分库分表)

    什么是数据分片? 简单来说,就是指通过某种特定的条件,将我们...2.表的关联操作需要放在代码中实现 3.事务的处理更加复杂 4.拆分过度所带来的复杂性会令人头痛,拆分之前慎重且慎重 2.库的垂直拆分:按照业务将表进

    Go-GoGolang的ORM库

    这些库通常包括模型定义、查询构建器、事务处理等功能,旨在减少数据库操作的复杂性。 描述中提到"Go Golang的ORM库",意味着我们关注的是Go语言环境下的特定ORM实现。在Go生态系统中,有几个知名的ORM库,如Gorm、...

    Go-一个go语言demo包含了Redis和MySQL的用法

    ORM是将数据库关系模型映射为面向对象模型的一种技术,它允许开发者使用面向对象的方式来操作数据库,降低了数据库操作的复杂性。在Go中,有许多优秀的ORM框架,如Gorm、XORM等。本项目可能使用了其中的一种,帮助...

    Go-golangmicroservice集成xormnsqetcd优化目录结构

    通过定义Go语言中的结构体,开发者可以轻松实现CRUD(创建、读取、更新、删除)操作,简化数据库交互的复杂性。 5. **NSQ**:NSQ是一款由Golang编写的实时分布式消息平台,用于构建实时大数据管道。在微服务架构中...

    一个简单的 golang orm

    Golang本身并不内置ORM支持,但社区提供了许多第三方库来填补这一空白,如Gorm、XORM、sqlx等。"Gourm"可能是其中之一,尽管它可能不如其他流行ORM那么功能齐全,但对于初学者或小型项目来说,它可能足够简单易用。 ...

    Go-golang的ORM除了mysql未做其他数据库的兼容

    3. 关联查询:支持一对一、一对多、多对多等复杂关系的数据操作。 4. 链式调用:通过链式方法调用来构建复杂的查询条件,提高代码可读性。 5. 数据库事务:提供事务管理功能,确保数据的一致性和完整性。 6. 批量...

    golang常用的src包

    这些`src`包是Go语言生态系统的重要组成部分,它们帮助开发者在数据库操作、Web开发、网络通信等领域实现复杂功能,提高代码复用性,降低开发难度。掌握这些库的使用,能让你的Go编程技能更上一层楼。在实际项目中,...

    GO数据库课程设计.zip

    对于更复杂的数据库操作,Go有一些优秀的ORM框架,如Gorm和XORM,它们提供了更高级别的抽象,简化了数据模型和数据库表之间的映射,以及CRUD操作。 总结,"GO数据库课程设计"主要涵盖了Go语言与数据库的连接、SQL...

    Go-Octillery是用于数据库分片的Go包(支持所有ORM或原始SQL)

    它可以与多种ORM(对象关系映射)库无缝配合,如xorm、gorp、gorm和dbr等。ORM库在Go中非常流行,它们简化了数据库操作,让开发者可以用面向对象的方式来处理数据。通过与这些ORM库的集成,Go-Octillery使得开发者...

    20D对20F需求评审结果1

    17. **术语一致性**:相同术语如Xorm和XORM的大小写应统一。 18. **术语解释**:模糊或不明确的术语(如"推拉")需详细说明。 19. **表格与编号**:表格的完整性与编号规则需一致,有助于阅读和查找。 20. **关联...

Global site tag (gtag.js) - Google Analytics