|
@@ -9,9 +9,14 @@ import (
|
|
|
"strings"
|
|
|
"time"
|
|
|
|
|
|
+ _ "github.com/ClickHouse/clickhouse-go/v2"
|
|
|
_ "github.com/go-sql-driver/mysql"
|
|
|
)
|
|
|
|
|
|
+const (
|
|
|
+ CLICKHOUSE = "clickhouse"
|
|
|
+)
|
|
|
+
|
|
|
type Mysql struct {
|
|
|
Address string //数据库地址:端口
|
|
|
UserName string //用户名
|
|
@@ -20,28 +25,40 @@ type Mysql struct {
|
|
|
DB *sql.DB `json:",optional"` //数据库连接池对象
|
|
|
MaxOpenConns int //用于设置最大打开的连接数,默认值为0表示不限制。
|
|
|
MaxIdleConns int //用于设置闲置的连接数。
|
|
|
+ driverName string
|
|
|
}
|
|
|
|
|
|
-func (m *Mysql) Init() {
|
|
|
- if m.MaxOpenConns <= 0 {
|
|
|
- m.MaxOpenConns = 30
|
|
|
+//
|
|
|
+func NewInit(driverName, dataSourceName string, maxOpenConns, maxIdleConns int) *Mysql {
|
|
|
+ if maxOpenConns <= 0 {
|
|
|
+ maxOpenConns = 30
|
|
|
}
|
|
|
- if m.MaxIdleConns <= 0 {
|
|
|
- m.MaxIdleConns = 6
|
|
|
+ if maxIdleConns <= 0 {
|
|
|
+ maxIdleConns = 6
|
|
|
}
|
|
|
- var err error
|
|
|
- m.DB, err = sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4", m.UserName, m.PassWord, m.Address, m.DBName))
|
|
|
+ db, err := sql.Open(driverName, dataSourceName)
|
|
|
if err != nil {
|
|
|
- log.Println(err)
|
|
|
- return
|
|
|
+ log.Println("open error", err)
|
|
|
+ return nil
|
|
|
}
|
|
|
- m.DB.SetMaxOpenConns(m.MaxOpenConns)
|
|
|
- m.DB.SetMaxIdleConns(m.MaxIdleConns)
|
|
|
- m.DB.SetConnMaxLifetime(14400 * time.Second)
|
|
|
- err = m.DB.Ping()
|
|
|
- if err != nil {
|
|
|
- log.Println(err)
|
|
|
+ db.SetMaxOpenConns(maxOpenConns)
|
|
|
+ db.SetMaxIdleConns(maxIdleConns)
|
|
|
+ db.SetConnMaxLifetime(14400 * time.Second)
|
|
|
+ if err := db.Ping(); err != nil {
|
|
|
+ log.Println("ping error", err)
|
|
|
+ return nil
|
|
|
}
|
|
|
+ return &Mysql{DB: db, driverName: driverName}
|
|
|
+}
|
|
|
+
|
|
|
+//
|
|
|
+func (m *Mysql) Init() {
|
|
|
+ m.driverName = "mysql"
|
|
|
+ nm := NewInit(m.driverName, fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4", m.UserName, m.PassWord, m.Address, m.DBName), m.MaxOpenConns, m.MaxIdleConns)
|
|
|
+ if nm == nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ m.DB = nm.DB
|
|
|
}
|
|
|
|
|
|
//新增
|
|
@@ -65,7 +82,7 @@ func (m *Mysql) InsertByTx(tx *sql.Tx, tableName string, data map[string]interfa
|
|
|
placeholders = append(placeholders, "?")
|
|
|
}
|
|
|
q := fmt.Sprintf("INSERT INTO %s (%s) VALUES (%s)", tableName, strings.Join(fields, ","), strings.Join(placeholders, ","))
|
|
|
- log.Println("mysql", q, values)
|
|
|
+ log.Println(q, values)
|
|
|
return m.InsertBySqlByTx(tx, q, values...)
|
|
|
}
|
|
|
|
|
@@ -80,6 +97,9 @@ func (m *Mysql) InsertBySqlByTx(tx *sql.Tx, q string, args ...interface{}) int64
|
|
|
if result == nil {
|
|
|
return -1
|
|
|
}
|
|
|
+ if m.driverName == CLICKHOUSE {
|
|
|
+ return 0
|
|
|
+ }
|
|
|
id, err := result.LastInsertId()
|
|
|
if err != nil {
|
|
|
log.Println(err)
|
|
@@ -133,6 +153,9 @@ func (m *Mysql) insertOrReplaceBatchByTx(tx *sql.Tx, tp string, afterInsert, tab
|
|
|
if result == nil {
|
|
|
return -1, -1
|
|
|
}
|
|
|
+ if m.driverName == CLICKHOUSE {
|
|
|
+ return 0, 0
|
|
|
+ }
|
|
|
v1, e1 := result.RowsAffected()
|
|
|
if e1 != nil {
|
|
|
log.Println(e1)
|
|
@@ -153,19 +176,24 @@ func (m *Mysql) ExecBySql(q string, args ...interface{}) (sql.Result, error) {
|
|
|
|
|
|
//sql语句执行,带有事务
|
|
|
func (m *Mysql) ExecBySqlByTx(tx *sql.Tx, q string, args ...interface{}) (sql.Result, error) {
|
|
|
- var stmtIns *sql.Stmt
|
|
|
+ var result sql.Result
|
|
|
var err error
|
|
|
- if tx == nil {
|
|
|
- stmtIns, err = m.DB.Prepare(q)
|
|
|
+ if m.driverName == CLICKHOUSE {
|
|
|
+ result, err = m.DB.Exec(q, args...)
|
|
|
} else {
|
|
|
- stmtIns, err = tx.Prepare(q)
|
|
|
- }
|
|
|
- if err != nil {
|
|
|
- log.Println(err)
|
|
|
- return nil, err
|
|
|
+ var stmtIns *sql.Stmt
|
|
|
+ if tx == nil {
|
|
|
+ stmtIns, err = m.DB.Prepare(q)
|
|
|
+ } else {
|
|
|
+ stmtIns, err = tx.Prepare(q)
|
|
|
+ }
|
|
|
+ if err != nil {
|
|
|
+ log.Println(err)
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ defer stmtIns.Close()
|
|
|
+ result, err = stmtIns.Exec(args...)
|
|
|
}
|
|
|
- defer stmtIns.Close()
|
|
|
- result, err := stmtIns.Exec(args...)
|
|
|
if err != nil {
|
|
|
log.Println(args, err)
|
|
|
return nil, err
|
|
@@ -259,21 +287,24 @@ func (m *Mysql) SelectBySqlByTx(tx *sql.Tx, q string, args ...interface{}) *[]ma
|
|
|
return m.Select(0, nil, tx, q, args...)
|
|
|
}
|
|
|
func (m *Mysql) Select(bath int, f func(l *[]map[string]interface{}) bool, tx *sql.Tx, q string, args ...interface{}) *[]map[string]interface{} {
|
|
|
- var stmtOut *sql.Stmt
|
|
|
+ var rows *sql.Rows
|
|
|
var err error
|
|
|
- if tx == nil {
|
|
|
- stmtOut, err = m.DB.Prepare(q)
|
|
|
+ if m.driverName == CLICKHOUSE {
|
|
|
+ rows, err = m.DB.Query(q, args...)
|
|
|
} else {
|
|
|
- stmtOut, err = tx.Prepare(q)
|
|
|
- }
|
|
|
- if err != nil {
|
|
|
- log.Println(err)
|
|
|
- return nil
|
|
|
+ var stmtOut *sql.Stmt
|
|
|
+ if tx == nil {
|
|
|
+ stmtOut, err = m.DB.Prepare(q)
|
|
|
+ } else {
|
|
|
+ stmtOut, err = tx.Prepare(q)
|
|
|
+ }
|
|
|
+ if err != nil {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ defer stmtOut.Close()
|
|
|
+ rows, err = stmtOut.Query(args...)
|
|
|
}
|
|
|
- defer stmtOut.Close()
|
|
|
- rows, err := stmtOut.Query(args...)
|
|
|
if err != nil {
|
|
|
- log.Println(err)
|
|
|
return nil
|
|
|
}
|
|
|
if rows != nil {
|
|
@@ -281,7 +312,6 @@ func (m *Mysql) Select(bath int, f func(l *[]map[string]interface{}) bool, tx *s
|
|
|
}
|
|
|
columns, err := rows.Columns()
|
|
|
if err != nil {
|
|
|
- log.Println(err)
|
|
|
return nil
|
|
|
}
|
|
|
list := []map[string]interface{}{}
|
|
@@ -415,11 +445,13 @@ func (m *Mysql) UpdateOrDeleteBySql(q string, args ...interface{}) int64 {
|
|
|
|
|
|
//带事务的修改或删除
|
|
|
func (m *Mysql) UpdateOrDeleteBySqlByTx(tx *sql.Tx, q string, args ...interface{}) int64 {
|
|
|
- result, err := m.ExecBySqlByTx(tx, q, args...)
|
|
|
- if err != nil {
|
|
|
- log.Println(err)
|
|
|
+ result, _ := m.ExecBySqlByTx(tx, q, args...)
|
|
|
+ if result == nil {
|
|
|
return -1
|
|
|
}
|
|
|
+ if m.driverName == CLICKHOUSE {
|
|
|
+ return 0
|
|
|
+ }
|
|
|
count, err := result.RowsAffected()
|
|
|
if err != nil {
|
|
|
log.Println(err)
|
|
@@ -480,14 +512,20 @@ func (m *Mysql) Count(tableName string, query map[string]interface{}) int64 {
|
|
|
return m.CountBySql(q, values...)
|
|
|
}
|
|
|
func (m *Mysql) CountBySql(q string, args ...interface{}) int64 {
|
|
|
- stmtIns, err := m.DB.Prepare(q)
|
|
|
- if err != nil {
|
|
|
- log.Println(err)
|
|
|
- return -1
|
|
|
+ var rows *sql.Rows
|
|
|
+ var err error
|
|
|
+ if m.driverName == CLICKHOUSE {
|
|
|
+ rows, err = m.DB.Query(q, args...)
|
|
|
+ } else {
|
|
|
+ var stmtOut *sql.Stmt
|
|
|
+ stmtOut, err = m.DB.Prepare(q)
|
|
|
+ if err != nil {
|
|
|
+ log.Println(err)
|
|
|
+ return -1
|
|
|
+ }
|
|
|
+ defer stmtOut.Close()
|
|
|
+ rows, err = stmtOut.Query(args...)
|
|
|
}
|
|
|
- defer stmtIns.Close()
|
|
|
-
|
|
|
- rows, err := stmtIns.Query(args...)
|
|
|
if err != nil {
|
|
|
log.Println(err)
|
|
|
return -1
|