简介

xorm是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作非常简便。xorm的目标并不是让你完全不去学习SQL,我们认为SQL并不会为ORM所替代,但是ORM将可以解决绝大部分的简单SQL需求。xorm支持两种风格的混用。

特性

支持Struct和数据库表之间的灵活映射,并支持自动同步

  • 事务支持
  • 同时支持原始SQL语句和ORM操作的混合执行
  • 使用连写来简化调用
  • 支持使用Id, In, Where, Limit, Join, Having, Table, SQL,Cols等函数和结构体等方式作为条件
  • 支持级联加载Struct
  • Schema支持(仅Postgres)
  • 支持缓存
  • 支持根据数据库自动生成xorm的结构体
  • 支持记录版本(即乐观锁)
  • 内置SQL Builder支持
  • 通过EngineGroup支持读写分离和负载均衡

驱动支持

xorm当前支持的驱动和数据库如下:

  • Mysql: github.com/go-sql-driver/mysql
  • MyMysql:github.com/ziutek/mymysql/godrv
  • Postgres: github.com/lib/pq
  • Tidb:github.com/pingcap/tidb
  • SQLite: github.com/mattn/go-sqlite3
  • MsSql:github.com/denisenkom/go-mssqldb
  • MsSql: github.com/lunny/godbc
  • Oracle: github.com/mattn/go-oci8 (试验性支持)
  • ql: github.com/cznic/ql(试验性支持)

安装

go get xorm.io/xorm

要想使用xorm要有mysql的驱动

go get -u github.com/go-sql-driver/mysql

简单使用

同步表结构

定义一个结构体

package modleimport "time"type User struct {Id       int64Name     stringAge      intPassword string    `xorm:"varchar(255)"`Created  time.Time `xorm:"created"` // 创建的时候自动创建Updated  time.Time `xorm:"updated"` // 更新的时候自动更新
}

main

package mainimport ("fmt"_ "github.com/go-sql-driver/mysql""xorm.io/xorm""xorm/modle"
)func link() {//数据库连接基本信息var (userName  string = "root"password  string = "mysql729"ipAddress string = "127.0.0.1"port      int    = 3306dbName    string = "go_test"charset   string = "utf8mb4")//构建数据库连接dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset:%s", userName, password, ipAddress, port, dbName, charset)engine, err := xorm.NewEngine("mysql", dataSourceName)if err != nil {fmt.Println("数据库连接失败")}err = engine.Sync(new(modle.User))if err != nil {fmt.Println("表结构同步失败")}}

查找

package mainimport ("fmt""xorm.io/xorm""xorm/modle"
)func main() {//数据库连接基本信息var (userName  string = "root"password  string = "mysql729"ipAddress string = "127.0.0.1"port      int    = 3306dbName    string = "go_test"charset   string = "utf8mb4")//构建数据库连接dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset:%s", userName, password, ipAddress, port, dbName, charset)engine, err := xorm.NewEngine("mysql", dataSourceName)if err != nil {fmt.Println("数据库连接失败")}//查询results, err := engine.Query("select * from user")fmt.Println(results)result2, err := engine.QueryString("select * from user")fmt.Println(result2)result3, err := engine.QueryInterface("select * from user")fmt.Println(result3)//Getuser := modle.User{}engine.Get(&user) // 无条件查询第一个数据fmt.Println(user)// 指定条件来查询用户user1 := modle.User{}engine.Where("name=?", "user").Desc("id")}

更新

package mainimport ("fmt"_ "github.com/go-sql-driver/mysql""xorm.io/xorm"
)func update() {//数据库连接基本信息var (userName  string = "root"password  string = "mysql729"ipAddress string = "127.0.0.1"port      int    = 3306dbName    string = "go_test"charset   string = "utf8mb4")//构建数据库连接dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset:%s", userName, password, ipAddress, port, dbName, charset)engine, err := xorm.NewEngine("mysql", dataSourceName)if err != nil {fmt.Println("数据库连接失败")}//user := modle.User{Name: "jay chou"}//n, _ := engine.ID(1000).Update(&user)//fmt.Println(n)engine.Exec("update user set age = ? where id = ?", 10, 10001)
}

插入

package mainimport ("fmt"_ "github.com/go-sql-driver/mysql""xorm.io/xorm""xorm/modle"
)func insert() {//数据库连接基本信息var (userName  string = "root"password  string = "mysql729"ipAddress string = "127.0.0.1"port      int    = 3306dbName    string = "go_test"charset   string = "utf8mb4")//构建数据库连接dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset:%s", userName, password, ipAddress, port, dbName, charset)engine, err := xorm.NewEngine("mysql", dataSourceName)if err != nil {fmt.Println("数据库连接失败")}//engine.InsertI() 插入对象,返回值:受影响的行数user := modle.User{Id: 1000, Name: "user", Age: 18, Password: "hhh"}n, _ := engine.Insert(&user)if n > 1 {fmt.Println("数据插入成功")}fmt.Println(n)user1 := modle.User{Id: 10001, Name: "user", Age: 18, Password: "hhh"}user2 := modle.User{Id: 10002, Name: "user", Age: 18, Password: "hhh"}n, _ = engine.Insert(&user1, &user2)if n > 1 {fmt.Println("数据插入成功")}//切片插入var users []modle.Userusers = append(users, modle.User{Id: 10003, Name: "user", Age: 18, Password: "hhh"})users = append(users, modle.User{Id: 10004, Name: "user", Age: 18, Password: "hhh"})n, _ = engine.Insert(&users)if n > 1 {fmt.Println("数据插入成功")}}

删除

package mainimport ("fmt"_ "github.com/go-sql-driver/mysql""xorm.io/xorm""xorm/modle"
)func del() {//数据库连接基本信息var (userName  string = "root"password  string = "mysql729"ipAddress string = "127.0.0.1"port      int    = 3306dbName    string = "go_test"charset   string = "utf8mb4")//构建数据库连接dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset:%s", userName, password, ipAddress, port, dbName, charset)engine, err := xorm.NewEngine("mysql", dataSourceName)if err != nil {fmt.Println("数据库连接失败")}user := modle.User{Name: "jay chou"}n, _ := engine.ID(1000).Delete(&user)fmt.Println(n)
}