Skip to content

toukii/orm-x

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

orm-x

orm for join on table, sql like this:

output

SELECT u.name AS u_name, uc.no AS uc_no, b.name AS b_name FROM user u INNER JOIN user_card uc ON u.id=uc.user_id INNER JOIN bank b ON uc.bank_id=b.id WHERE u.name='toukii'

Because refer to multi tables, columns should have an alias(use the default alias: [table alias]_[column name]).

usage

m := NewMask("Mask", user, userCard, bank)
user.Select(m).InnerJoin(userCard, "u.id=uc.user_id").InnerJoin(bank, "uc.bank_id=b.id").Where("u.name='toukii'")
fmt.Println(user.Sql())

user,userCard,bank are tableModel:

  • 1 use yaml parse
tb, err := MultiParse("test_yaml/model.yaml")

user := tb["User"]
userCard := tb["UserCard"]
bank := tb["Bank"]
  • 2 new
user := NewT("user", "u", []string{"id", "name"})
user.Mask["Mask"] = []string{"name"}

You may want this usefull lib (sq.Rows scanner): github.com/didi/gendry/scanner

scanner example code:

package orm

import (
	"fmt"

	"github.com/didi/gendry/scanner"
)

type ExampleMask struct {
	Name     string `db:"u_name"`
	CardNo   string `db:"uc_no"`
	BankName string `db:"b_name"`
}

func ExampleScan() {
	scanner.SetTagName("db")
	rows, err := Mysql().Query("SELECT u.name AS u_name, uc.no AS uc_no, b.name AS b_name FROM user u INNER JOIN user_card uc ON u.id=uc.user_id INNER JOIN bank b ON uc.bank_id=b.id")

	var mask []*ExampleMask
	err = scanner.Scan(rows, &mask)
	if err != nil {
		panic(err)
	}

	for _, m := range mask {
		fmt.Printf("%+v\n", m)
	}
}

result:

&{Name:toukii CardNo:6214xxxxxxxx8890 BankName:中国招商银行}
&{Name:toukii CardNo:6214xxxxxxxx5760 BankName:上海浦发银行}

Releases

No releases published

Packages

No packages published

Languages