https://my.oschina.net/goskyblue/blog/206799
http://blog.xorm.io/2014/1/1/1-7-weapons.html
xorm is a very famous golang lib, for operating relation database.
Install
go get -v github.com/go-xorm/xorm
Documentation
Get started
Import packages
package main
import (
"log"
"github.com/go-xorm/xorm"
_ "github.com/mattn/go-sqlite3"
)
Define models
type User struct {
Id int64
Name string `xorm:"unique"`
Email string
}
Create database engine
var xe *xorm.Engine
func init() {
var err error
xe, err = xorm.NewEngine("sqlite3", "./test.db")
if err != nil {
log.Fatal(err)
}
if err = xe.Sync(&User{}); err != nil {
log.Fatal(err)
}
}
Insert and Query
func main() {
xe.Insert(&User{Name: "UU", Email: "uu@example.com"})
var user = &User{Name: "UU"}
exists, err := xe.Get(user)
if err != nil {
log.Fatal(err)
}
log.Printf("Exists: %v, User: %#v", exists, user)
}
Driver and source
Example
x, err := xorm.NewEngine("mysql", "root:123@/test?charset=utf8")
defer x.Close()
other driver
mysql github.com/go-sql-driver/mysql
[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...¶mN=valueN]
mymysql github.com/ziutek/mymysql/godrv
usage todo.
postgresql github.com/lib/pq
1. postgres://username:password@address/dbname?sslmode=verify-full
2. user=pqgotest dbname=pqgotest sslmode=verify-full
sqlite3 github.com/mattn/go-sqlite3
1. ./dbfile
Define models
// default matches
// - string => varchar(255)
type Model struct {
Id int64
SmallInt int64 `xorm:"smallint"`
Int int64 `xorm:"int"`
Text string `xorm:"text"`
DefaultVal int64 `xorm:"default 3"`
Bool bool `xorm:"bool"`
Unique string `xorm:"unique"` // unique([Unique])
UniqA1 string `xorm:"unique(a)"` // unique([UniqA1, UniqA2])
UniqA2 string `xorm:"unique(a)"`
Version int64 `xorm:"version"` // will be filled 1 on insert and autoincr on update
CreatedAt time.Time `xorm:"created"` // will be filled in current time on insert
UpdatedAt time.Time `xorm:"updated"` // will be filled in current time on insert or update
}
column types
ref: https://github.com/lunny/xorm/blob/master/docs/COLUMNTYPE.md
- pk # primary key
- autoincr
- [not ]null
- unique or unique(uniquename)
- index or index(indexname)
- extends
- `- # ignore this field
- created # This field will be filled in current time on insert
- version # This field will be filled 1 on insert and autoincrement on update
- default 0 # default value, need quoted if it is a string
CRUD funcs
Create, Retrive, Update, Delete
INSERT (Create) more
-
Insert one record
user := &User{ Name: "test", } affected, err := engine.Insert(user)
-
Insert multi records
users := make([]User, 0) users = append(users, User{Name: "test"}) affected, err := engine.Insert(&users)
Query (Retrieve) more
-
Get one record
var user = User{Id: 1} has, err := engine.Get(&user)
-
Fetch multi records in to slice or map
var everyone []User err := engine.Find(&everyone) users := make(map[int64]User) err := engine.Find(&users)
-
Use where and limit
var users []User err := engine.Where("id > ?", 3).Limit(10, 5).Find(&users) // limit 10 offset 5
-
Query use struct
var users []User err := engine.Find(&users, &User{School: "hangzhou"})
-
Use in function
var users []User err := engine.In("id", 1, 3, 5).Find(&users)
-
Default will query all cols, use Cols to restrict that
var users []User err := engine.Cols("id", "name").Find(&users)
-
Count
total, err := engine.Where("id > ?", 1).Count(&User{})
If user is not empty, it will become the select rule.
total, err := engine.Count(&User{School: "hangzhou"})
-
Complex example
var users []User err = x.Cols("age", "name") .Where("`age` > ?", 10) .And("`age` < 30") .Limit(10, 5) // limit 10 offset 5 .Desc("age") .In("school", "hangzhou", "beijing"}) .Find(&users)