mix/xsql 基于 database/sql 的轻量数据库,支持任何数据库驱动。

onanying · · 721 次点击 · 开始浏览    置顶

> OpenMix 出品:[https://openmix.org](https://openmix.org/mix-go) ## Mix XSQL 基于 database/sql 的轻量数据库,功能完备且支持任何数据库驱动。 A lightweight database based on database/sql ## Github 点个 `Star` - [https://github.com/mix-go/mix](https://github.com/mix-go/mix) ## 安装 ``` go get github.com/mix-go/xsql ``` ## 初始化 - mysql 初始化,使用 [go-sql-driver/mysql](https://github.com/go-sql-driver/mysql) 驱动。 ```go import _ "github.com/go-sql-driver/mysql" db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8") if err != nil { log.Fatal(err) } DB := xsql.New(db) ``` - oracle 初始化,使用 [sijms/go-ora/v2](https://github.com/sijms/go-ora) 驱动 (无需安装 instantclient)。 ```go import _ "github.com/sijms/go-ora/v2" db, err := sql.Open("oracle", "oracle://root:123456@127.0.0.1:1521/orcl") if err != nil { log.Fatal(err) } DB := xsql.New(db) ``` - [xorm#drivers](https://github.com/go-xorm/xorm#drivers-support) 这些驱动也都支持 ## 查询 可以像脚本语言一样使用,不绑定结构体,直接自由获取每个字段的值。 > oracle 字段、表名需要大写 ```go rows, err := DB.Query("SELECT * FROM xsql") if err != nil { log.Fatal(err) } id := rows[0].Get("id").Int() foo := rows[0].Get("foo").String() bar := rows[0].Get("bar").Time() // time.Time val := rows[0].Get("bar").Value() // interface{} ``` ### 映射 当然你也可以像 `gorm`, `xorm` 一样映射使用。 > oracle 字段、表名需要大写 ```go type Test struct { Id int `xsql:"id"` Foo string `xsql:"foo"` Bar time.Time `xsql:"bar"` // oracle 使用 goora.TimeStamp } func (t Test) TableName() string { return "tableName" } ``` ### `First()` 映射第一行 > oracle 占位符需修改为 :id ```go var test Test err := DB.First(&test, "SELECT * FROM xsql WHERE id = ?", 1) if err != nil { log.Fatal(err) } ``` ### `Find()` 映射全部行 ```go var tests []Test err := DB.Find(&tests, "SELECT * FROM xsql") if err != nil { log.Fatal(err) } ``` ## 插入 ### `Insert()` ```go test := Test{ Id: 0, Foo: "test", Bar: time.Now(), } res, err := DB.Insert(&test) if err != nil { log.Fatal(err) } ``` ### `BatchInsert()` ```go tests := []Test{ { Id: 0, Foo: "test", Bar: time.Now(), }, { Id: 0, Foo: "test", Bar: time.Now(), }, } res, err := DB.BatchInsert(&tests) if err != nil { log.Fatal(err) } ``` ## 更新 > oracle 占位符需修改为 :id ```go test := Test{ Id: 10, Foo: "update", Bar: time.Now(), } res, err := DB.Update(&test, "id = ?", 10) ``` ## 删除 采用 `Exec()` 手动执行删除,也可手动执行更新操作。 > oracle 占位符需修改为 :id ```go res, err := DB.Exec("DELETE FROM xsql WHERE id = ?", 10) ``` ## 事务 ```go tx, err := DB.Begin() if err != nil { log.Fatal(err) } test := Test{ Id: 0, Foo: "test", Bar: time.Now(), } res, err := tx.Insert(&test) if err != nil { tx.Rollback() log.Fatal(err) } tx.Commit() ``` ## 配置 在 `xsql.New()` 方法中可以传入以下配置对象 - 默认为 mysql 模式,当切换到 oracle 时,需要[修改配置](https://github.com/mix-go/mix/blob/master/src/xsql/dbora_test.go#L18) - `Insert()`、`BatchInsert()` 可在执行时传入配置,覆盖 insert 相关的配置,比如将 InsertKey 修改为 REPLACE INTO ```go type Options struct { // 默认: INSERT INTO InsertKey string // 默认: ? // oracle 可配置为 :%d Placeholder string // 默认:` // oracle 可配置为 " ColumnQuotes string // 默认:== DefaultTimeLayout TimeLayout string // 默认:== DefaultTimeFunc // oracle 可修改这个闭包增加 TO_TIMESTAMP TimeFunc TimeFunc // 全局 debug SQL DebugFunc DebugFunc } ``` ## 日志 在 `xsql.New()` 方法时传入配置 `DebugFunc`,可以在这里使用任何日志库打印SQL信息。 ```go opts := Options{ DebugFunc: func(l *Log) { log.Println(l) }, } DB := New(db, opts) ``` 日志对象包含以下字段 ```go type Log struct { Time time.Duration `json:"time"` SQL string `json:"sql"` Bindings []interface{} `json:"bindings"` } ``` ## License Apache License Version 2.0, http://www.apache.org/licenses/

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

721 次点击  ∙  1 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传