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

onanying · 2022-09-07 14:12:29 · 1548 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2022-09-07 14:12:29 的主题,其中的信息可能已经有所发展或是发生改变。

OpenMix 出品:https://openmix.org

Mix XSQL

基于 database/sql 的轻量数据库,功能完备且支持任何数据库驱动。

A lightweight database based on database/sql

Github 点个 Star

安装

go get github.com/mix-go/xsql

初始化

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 驱动 (无需安装 instantclient)。
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)

查询

可以像脚本语言一样使用,不绑定结构体,直接自由获取每个字段的值。

oracle 字段、表名需要大写

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 字段、表名需要大写

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

var test Test
err := DB.First(&test, "SELECT * FROM xsql WHERE id = ?", 1)
if err != nil {
    log.Fatal(err)
}

Find()

映射全部行

var tests []Test
err := DB.Find(&tests, "SELECT * FROM xsql")
if err != nil {
    log.Fatal(err)
}

插入

Insert()

test := Test{
    Id:  0,
    Foo: "test",
    Bar: time.Now(),
}
res, err := DB.Insert(&test)
if err != nil {
    log.Fatal(err)
}

BatchInsert()

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

test := Test{
    Id:  10,
    Foo: "update",
    Bar: time.Now(),
}
res, err := DB.Update(&test, "id = ?", 10)

删除

采用 Exec() 手动执行删除,也可手动执行更新操作。

oracle 占位符需修改为 :id

res, err := DB.Exec("DELETE FROM xsql WHERE id = ?", 10)

事务

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 时,需要修改配置
  • Insert()BatchInsert() 可在执行时传入配置,覆盖 insert 相关的配置,比如将 InsertKey 修改为 REPLACE INTO
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信息。

opts := Options{
    DebugFunc: func(l *Log) {
        log.Println(l)
    },
}
DB := New(db, opts)

日志对象包含以下字段

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

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