官网:http://www.xorm.io/
xorm是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作非常简便。xorm的目标并不是让你完全不去学习SQL,我们认为SQL并不会为ORM所替代,但是ORM将可以解决绝大部分的简单SQL需求。xorm支持两种风格的混用。
文章目录
- xorm
- 特性
- 驱动支持
- 安装
- 创建Orm引擎
- mysql
- mssql
- github.com/lunny/godbc
- github.com/denisenkom/go-mssqldb
- sqlite3
- 日志
- 连接池
xorm 特性
- 支持Struct和数据库表之间的灵活映射,并支持自动同步表结构
- 事务支持
- 支持原始SQL语句和ORM操作的混合执行
- 使用连写来简化调用
- 支持使用Id, In, Where, Limit, Join, Having, Table, Sql, Cols等函数和结构体等方式作为条件
- 支持级联加载Struct
- 支持LRU缓存(支持memory, memcache, leveldb, redis缓存Store) 和 Redis缓存
- 支持反转,即根据数据库自动生成xorm的结构体
- 支持事件
- 支持created, updated, deleted和version记录版本(即乐观锁)
- 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
gopm get github.com/go-xorm/xorm
或者您也可以使用go工具进行安装:
go get github.com/go-xorm/xorm
创建Orm引擎 在xorm里面,可以同时存在多个Orm引擎,一个Orm引擎称为Engine,一个Engine一般只对应一个数据库。Engine通过调用xorm.NewEngine生成,如:
mysql
package mainimport (
"fmt"
"github.com/go-xorm/xorm"
_"github.com/go-sql-driver/mysql"
)var engine *xorm.Enginefunc main(){
//数据库名称:数据库连接密码@(数据库地址:3306)/数据库实例名称?charset=utf8
engine, err := xorm.NewEngine("mysql", "root:123456@(127.0.0.1:3306)/arguse?charset=utf8mb4")
if err != nil{
fmt.Println(err)
}else{
fmt.Println("ping .... OK")
} engine.ShowSQL(true)// 显示SQL的执行, 便于调试分析
}
创建完engine之后,并没有立即连接数据库,此时可以通过engine.Ping()来进行数据库的连接测试是否可以连接到数据库。另外对于某些数据库有超时设置,可以通过一个定期Ping的Go程序来保持连接鲜活
mssql github.com/lunny/godbc
package mainimport (
"fmt"
_ "github.com/lunny/godbc"
"github.com/go-xorm/xorm"
)var engine *xorm.Enginefunc main(){
//数据库名称:数据库连接密码@(数据库地址:3306)/数据库实例名称?charset=utf8
engine, err := xorm.NewEngine("odbc", "driver={SQL Server};
Server=192.168.133.133;
Database=arguse;
uid=sa;
pwd=123456;
")
if err != nil{
fmt.Println("新建引擎", err)
return
}
if err = engine.Ping();
err != nil{
fmt.Println(err)
return
}else{
fmt.Println("ping ok")
} engine.ShowSQL(true)// 显示SQL的执行, 便于调试分析
}
血泪教训:如果出现奇奇怪怪的错误。记得看看对应数据库中有没有这个表
github.com/denisenkom/go-mssqldb
//数据库名称:数据库连接密码@(数据库地址:3306)/数据库实例名称?charset=utf8
//server=%s;
database=%s;
user id=%s;
password=%s;
port=%d;
encrypt=disable
engine, err := xorm.NewEngine("mssql", "server=192.168.133.133;
database=master;
user id=sa;
password=123456;
encrypt=disable")
if err != nil{
fmt.Println("新建引擎", err)
return
}
if err = engine.Ping();
err != nil{
fmt.Println(err)
return
}else{
fmt.Println("ping ok")
} engine.ShowSQL(true)// 显示SQL的执行, 便于调试分析
血泪教训:如果出现错误mssql: 对象名 ‘userinfo’ 无效。记得看看对应数据库中有没有这个表
如果不添加encrypt=disable,会报错Login error: read tcp 192.168.133.1:54818->192.168.133.133:1433: wsarecv: An existing connection was forcibly closed by the remote host.
sqlite3
import (
_ "github.com/mattn/go-sqlite3"
"github.com/go-xorm/xorm"
)var engine *xorm.Enginefunc main() {
var err error
engine, err = xorm.NewEngine("sqlite3", "./test.db")
}
一般情况下如果只操作一个数据库,只需要创建一个engine即可。
对于有大量数据并且需要分区的应用,也可以根据规则来创建多个Engine,比如:
var err error
for i:=0;
i<5;
i++ {
engines[i], err = xorm.NewEngine("sqlite3", fmt.Sprintf("./test%d.db", i))
}
engine是GoRoutine安全的。
engine可以通过engine.Close来手动关闭,但是一般情况下可以不用关闭,在程序退出时会自动关闭。
NewEngine传入的参数和sql.Open传入的参数完全相同,因此,在使用某个驱动前,请查看此驱动中关于传入参数的说明文档。以下为各个驱动的连接符对应的文档链接:
- sqlite3
- mysql dsn
- mymysql
- postgres
日志 日志是一个接口,通过设置日志,可以显示SQL,警告以及错误等,默认的显示基本未INFO。
- engine.ShowSQL(true),则会在控制台打印出生成的SQL语句;
- engine.Logger().SetLevel(core.LOG_DEBUG),则会在控制台打印调试以及以上的信息;
f, err := os.Create("sql.log")
if err != nil {
println(err.Error())
return
}
engine.SetLogger(xorm.NewSimpleLogger(f))
当然,如果希望将日志记录到syslog中,也可以如下:
logWriter, err := syslog.New(syslog.LOG_DEBUG, "rest-xorm-example")
if err != nil {
log.Fatalf("Fail to create xorm system logger: %v\n", err)
}logger := xorm.NewSimpleLogger(logWriter)
logger.ShowSQL(true)
engine.SetLogger(logger)
连接池 【#|xorm之创建orm引擎】engine内部支持连接池接口和对应的函数。
- 如果需要设置连接池的空闲数大小,可以使用engine.SetMaxIdleConns()来实现。
- 如果需要设置最大打开连接数,则可以使用engine.SetMaxOpenConns()来实现。
推荐阅读
- 数据结构和算法|LeetCode 的正确使用方式
- #|7.分布式事务管理
- 【golang】leetcode中级-字母异位词分组&无重复字符的最长子串
- #|算法设计与分析(Java实现)——贪心算法(集合覆盖案例)
- #|算法设计与分析(Java实现)—— 动态规划 (0-1 背包问题)
- #|阿尔法点亮LED灯(一)汇编语言
- #|Multimedia
- #|ARM裸机开发(汇编LED灯实验(I.MX6UL芯片))
- 基础课|使用深度优先搜索(DFS)、广度优先搜索(BFS)、A* 搜索算法求解 (n^2 -1) 数码难题,耗时与内存占用(时空复杂度)对比(附((n^2 - 1) 数码问题控
- #|学习笔记 | Ch05 Pandas数据清洗 —— 缺失值、重复值、异常值