package
0.0.0-20200518095232-1fa3e640cc5f
Repository: https://github.com/sereiner/library.git
Documentation: pkg.go.dev

# README

db

  • 高效的sql表达式翻译器,对于复杂的查询条件,可以简化sql.
  • 内置多种表达式,满足大多数需求.
  • 支持大多数数据库,oracle,mysql,sqlite,postgres

示例

示例数据表(students)
idnamegenderid_numcollegemajorcreate_at
20180101杜子腾158177199901044792计算机学院计算机科学与工程2019-09-01 08:23:34
20180102杜琦燕151008199801178529外国语学院英语2019-09-02 14:53:04
20180103范统17156319980116959X计算机学院计算机科学与工程2019-09-03 09:00:09
20180104史珍香141992199701078600外国语学院日语2019-09-04 10:23:34
创建db对象
    db, err := NewDB("mysql","root:123456@tcp(127.0.0.1:3306)/go?charset=utf8mb4&parseTime=True&loc=PRC",20,10,600)
    if err != nil {
        panic(err)
    }
    
    // user db to do
    .....
@

替换为参数化字符

比如我们现在要查询 gender=男 且 college = 计算机学院 的学生姓名

db.Query(`select name from students where gender=@gender and college = @college`,map[string]interface{}{
    "gender": "男",
    "college": "计算机学院",
})

那么我们的解析器会将sql和参数解析为

sql: select name from students where gender=? and college = ? args: [男 计算机学院]

#

原样替换为指定值,值为空时返回 NULL

我们现在使用in查询,查询 id 在 [20180101,20180103,20180105] 中的学生姓名

db.Query(`select name from students where id in #ids`,map[string]interface{}{
   "ids":"(20180101,20180103,20180105)",
})
  • 那么我们的解析器会将sql解析为:
  • sql: select name from students where id in (20180101,20180103,20180105)
  • 如果 ids 参数没有传,或者为空. sql将解析为: select name from students where id in NULL ,这会导致sql执行错误
$

原样替换为指定值,值为空时返回 ""

  • 同上, 如果 ids 参数没有传,或者为空.sql将解析为: select name from students where id in ,这会导致sql执行错误
[

>= 表达式,值为空时返回"",否则返回: and name >= value

我们现在要查询创建时间在 9月2号到9月4号之间的女同学学生姓名

db.Query(`select name from students where gender = @gender [start_time ]end_time`,map[string]interface{}{
    "gender":"女",
   "start_time":"2019-09-02 00:00:00",
   "end_time":"2019-09-04 23:59:59",
})
  • 那么我们的解析器会将sql解析为:
  • sql: select name from students where gender = ? and start_time>=? and end_time<=? args: [女 2019-09-02 00:00:00 2019-09-04 23:59:59]
  • 如果 end_time 参数没有传,或者为空. sql将解析为: select name from students where gender = ? and start_time>=? args: [女 2019-09-02 00:00:00]
]

<= 表达式,值为空时返回"",否则返回: and name <= value

  • 使用方法同上
~

检查值,值为空时返回"",否则返回: , name=value

当我们要更新 杜子腾 的专业时,而性别又是一个可选更新项目

db.Execute(`update students set major = @major ~gender where name = @name`,map[string]interface{}{
   "gender":"女",
   "major":"网络工程",
   "name":"杜子腾",
})
  • 那么我们的解析器会将sql解析为:
  • sql: update students set major = ? ,gender=? where name = ? args: [网络工程 女 杜子腾]
  • 如果 gender 参数没有传,或者为空. sql将解析为: update students set major = ? where name = ? args: [网络工程 杜子腾]
&

and 条件表达式,检查值,值为空时返回"",否则返回: and name=value

要查询计算机学院的学生姓名,但是性别是可选条件时

db.Query(`select name from students where collage = @collage &gender`,map[string]interface{}{
   "gender":"女",
   "collage":"计算机学院",
})
  • 那么我们的解析器会将sql解析为:
  • sql: select name from students where collage = ? and gender=? args: [计算机学院 女]
  • 如果 gender 参数没有传,或者为空. sql将解析为: select name from students where collage = ? args:[计算机学院]
|

or 条件表达式,检查值,值为空时返回"", 否则返回: or name=value

  • 使用方法同上
?

like 条件表达式

你模糊记得有一个叫珍香的女生,但是具体叫什么记不起了,可用使用模糊查询

db.Query(`select * from students where gender = @gender ?name`,map[string]interface{}{
       "gender":"女",
       "name":"珍香",
})
  • 那么我们的解析器会将sql解析为:
  • sql: select * from students where gender = ? and name like '%?%' args [女 珍香]
  • 如果 name 参数没有传,或者为空. sql将解析为: select * from students where gender = ? args: [女]

复杂sql

  • 对于复杂sql,分页,join,子查询,别名,都有比较好的支持.

# Packages

No description provided by the author

# Functions

NewDB 创建DB实例.
NewSysDB 创建DB实例.

# Constants

OCI8 oralce数据库.
ORA oralce数据库.
SQLITE3 Sqlite3数据库.

# Structs

DB 数据库操作类.
DBTrans 数据库事务操作类.
SysDB 数据库实体.
SysDBTransaction 事务.

# Interfaces

IDB 数据库操作接口,安装可需能需要执行export LD_LIBRARY_PATH=/usr/local/lib.
IDBTrans 数据库事务接口.
No description provided by the author
No description provided by the author
ISysDBTrans 数据库事务接口.

# Type aliases

QueryRow 查询的数据行.
QueryRows 多行数据.