|
|
|
@ -2,6 +2,7 @@ package dbquery |
|
|
|
|
|
|
|
import ( |
|
|
|
"database/sql" |
|
|
|
"github.com/jmoiron/sqlx" |
|
|
|
"log" |
|
|
|
"strconv" |
|
|
|
|
|
|
|
@ -44,16 +45,33 @@ func Insert(dbName, table string, data map[string]string) (int64, error) { |
|
|
|
valueList[i] = value |
|
|
|
i++ |
|
|
|
} |
|
|
|
|
|
|
|
result, err := DB.Exec("insert into "+dbName+" ("+strings.Join(keyList, ",")+") value("+strings.Join(keyStr, ",")+")", valueList...) |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
log.Println("ERROR|插入", dbName, "数据失败,", err) |
|
|
|
return insertId, err |
|
|
|
var Sql string |
|
|
|
Sql = "insert into " + dbName + " (" + strings.Join(keyList, ",") + ") values (" + strings.Join(keyStr, ",") + ")" |
|
|
|
if DB_PROVIDER == "PgsqlDb" { |
|
|
|
Sql = sqlx.Rebind(sqlx.DOLLAR, Sql) |
|
|
|
Sql = ReplaeByOtherSql(Sql, "PgsqlDb", "add") |
|
|
|
stmt, err = DB.Prepare(Sql) |
|
|
|
if err != nil { |
|
|
|
return 0, errors.New("创建失败:" + err.Error()) |
|
|
|
} |
|
|
|
row := stmt.QueryRow(valueList...) |
|
|
|
var id int64 |
|
|
|
err = row.Scan(&id) // 扫描 RETURNING 返回的 ID
|
|
|
|
if err != nil { |
|
|
|
return 0, errors.New("创建失败:" + err.Error()) |
|
|
|
} |
|
|
|
return id, nil |
|
|
|
} else { |
|
|
|
insertId, _ = result.LastInsertId() |
|
|
|
time.Sleep(time.Second * 2) |
|
|
|
return insertId, nil |
|
|
|
result, err := DB.Exec(Sql, valueList...) |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
log.Println("ERROR|插入", dbName, "数据失败,", err) |
|
|
|
return insertId, err |
|
|
|
} else { |
|
|
|
insertId, _ = result.LastInsertId() |
|
|
|
time.Sleep(time.Second * 2) |
|
|
|
return insertId, nil |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
@ -67,7 +85,6 @@ func Update(dbName, table string, data map[string]string, where map[string]strin |
|
|
|
if dbName == "" && table == "" { |
|
|
|
return rowsAffected, errors.New("没有数据表") |
|
|
|
} |
|
|
|
|
|
|
|
if strings.Contains(table, "select ") { |
|
|
|
dbName = table |
|
|
|
} else { |
|
|
|
@ -109,7 +126,15 @@ func Update(dbName, table string, data map[string]string, where map[string]strin |
|
|
|
log.Println("ERROR|修改数据表", dbName, "时条件中有空数据,条件:", where, "数据:", data) |
|
|
|
return rowsAffected, errors.New("条件中有空数据") |
|
|
|
} |
|
|
|
result, err := DB.Exec("update "+dbName+" set "+strings.Join(keyList, " , ")+" where "+strings.Join(whereStr, " and "), valueList...) |
|
|
|
var Sql string |
|
|
|
Sql = "update " + dbName + " set " + strings.Join(keyList, " , ") + " where " + strings.Join(whereStr, " and ") |
|
|
|
if DB_PROVIDER == "PgsqlDb" { |
|
|
|
Sql = sqlx.Rebind(sqlx.DOLLAR, Sql) |
|
|
|
Sql = ReplaeByOtherSql(Sql, "PgsqlDb", "") |
|
|
|
} else if DB_PROVIDER == "DmSql" { |
|
|
|
Sql = ReplaeByOtherSql(Sql, "DmSql", "") |
|
|
|
} |
|
|
|
result, err := DB.Exec(Sql, valueList...) |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
log.Println("ERROR|修改", dbName, "数据失败,", err) |
|
|
|
@ -131,7 +156,6 @@ func Delete(dbName, table string, data map[string]string, del_count ...string) ( |
|
|
|
if dbName == "" && table == "" { |
|
|
|
return count, errors.New("没有数据表") |
|
|
|
} |
|
|
|
|
|
|
|
if strings.Contains(table, "select ") { |
|
|
|
dbName = table |
|
|
|
} else { |
|
|
|
@ -167,7 +191,15 @@ func Delete(dbName, table string, data map[string]string, del_count ...string) ( |
|
|
|
limitStr = " limit " + del_count[0] |
|
|
|
|
|
|
|
} |
|
|
|
result, err := DB.Exec("delete from "+dbName+" where "+strings.Join(keyList, " and ")+limitStr, valueList...) |
|
|
|
var Sql string |
|
|
|
Sql = "delete from " + dbName + " where " + strings.Join(keyList, " and ") + limitStr |
|
|
|
if DB_PROVIDER == "PgsqlDb" { |
|
|
|
Sql = sqlx.Rebind(sqlx.DOLLAR, Sql) |
|
|
|
Sql = ReplaeByOtherSql(Sql, "PgsqlDb", "") |
|
|
|
} else if DB_PROVIDER == "DmSql" { |
|
|
|
Sql = ReplaeByOtherSql(Sql, "DmSql", "") |
|
|
|
} |
|
|
|
result, err := DB.Exec(Sql, valueList...) |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
log.Println("ERROR|删除", dbName, "数据失败,", err) |
|
|
|
@ -191,7 +223,6 @@ func GetData(dbName, table string, title string, where map[string]string, limit |
|
|
|
if dbName == "" && table == "" { |
|
|
|
return count, info, errors.New("没有数据表") |
|
|
|
} |
|
|
|
|
|
|
|
dbName = getTableName(dbName, table) |
|
|
|
|
|
|
|
if len(title) < 1 { |
|
|
|
@ -210,7 +241,11 @@ func GetData(dbName, table string, title string, where map[string]string, limit |
|
|
|
if _, ok := limit["from"]; ok { |
|
|
|
from = limit["from"] |
|
|
|
} |
|
|
|
limitStr += " limit " + from + ",1" |
|
|
|
if DB_PROVIDER == "PgsqlDb" { |
|
|
|
limitStr += " limit 1 OFFSET " + from |
|
|
|
} else { |
|
|
|
limitStr += " limit " + from + ",1" |
|
|
|
} |
|
|
|
|
|
|
|
} else { |
|
|
|
limitStr = " limit 1" |
|
|
|
@ -241,8 +276,15 @@ func GetData(dbName, table string, title string, where map[string]string, limit |
|
|
|
var err error |
|
|
|
var queryNum int = 0 |
|
|
|
for queryNum < 3 { //如发生错误,继续查询3次,防止数据库连接断开问题
|
|
|
|
|
|
|
|
rows, err = DB.Query("SELECT "+title+" FROM "+dbName+" where "+strings.Join(keyList, " and ")+" "+limitStr, valueList...) |
|
|
|
var Sql string |
|
|
|
Sql = "SELECT " + title + " FROM " + dbName + " where " + strings.Join(keyList, " and ") + " " + limitStr |
|
|
|
if DB_PROVIDER == "PgsqlDb" { |
|
|
|
Sql = sqlx.Rebind(sqlx.DOLLAR, Sql) |
|
|
|
Sql = ReplaeByOtherSql(Sql, "PgsqlDb", "") |
|
|
|
} else if DB_PROVIDER == "DmSql" { |
|
|
|
Sql = ReplaeByOtherSql(Sql, "DmSql", "") |
|
|
|
} |
|
|
|
rows, err = DB.Query(Sql, valueList...) |
|
|
|
|
|
|
|
if err == nil { |
|
|
|
break |
|
|
|
@ -259,30 +301,64 @@ func GetData(dbName, table string, title string, where map[string]string, limit |
|
|
|
return count, info, err |
|
|
|
} |
|
|
|
|
|
|
|
var index string |
|
|
|
var rowerr error |
|
|
|
columns, _ := rows.Columns() |
|
|
|
scanArgs := make([]interface{}, len(columns)) |
|
|
|
values := make([]interface{}, len(columns)) |
|
|
|
|
|
|
|
for i := range values { |
|
|
|
scanArgs[i] = &values[i] |
|
|
|
} |
|
|
|
if DB_PROVIDER == "DmSql" { |
|
|
|
columnTypes, _ := rows.ColumnTypes() |
|
|
|
scanArgs := make([]interface{}, len(columns)) |
|
|
|
|
|
|
|
var index string |
|
|
|
var rowerr error |
|
|
|
for rows.Next() { |
|
|
|
rowerr = rows.Scan(scanArgs...) |
|
|
|
if rowerr == nil { |
|
|
|
for i, col := range values { |
|
|
|
if col != nil { |
|
|
|
index = helper.StrFirstToUpper(columns[i]) |
|
|
|
info[index] = helper.ToString(col) |
|
|
|
for i, colType := range columnTypes { |
|
|
|
//fmt.Printf("字段: %s, 数据库类型: %s, 扫描类型: %v\n", columns[i], colType.DatabaseTypeName(), colType.ScanType())
|
|
|
|
// 为 DECIMAL 类型创建专用的扫描变量,达梦8中如果只少于1时,前面0会丢失
|
|
|
|
if colType.DatabaseTypeName() == "DECIMAL" { |
|
|
|
var decimalStr sql.RawBytes |
|
|
|
scanArgs[i] = &decimalStr |
|
|
|
} else { |
|
|
|
var val interface{} |
|
|
|
scanArgs[i] = &val |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
for rows.Next() { |
|
|
|
rowerr = rows.Scan(scanArgs...) |
|
|
|
if rowerr == nil { |
|
|
|
for i, col := range scanArgs { |
|
|
|
if col != nil { |
|
|
|
index = helper.StrFirstToUpper(strings.ToLower(columns[i])) |
|
|
|
info[index] = DmFormatDecimal(col) |
|
|
|
} |
|
|
|
} |
|
|
|
count++ |
|
|
|
} else { |
|
|
|
log.Println("ERROR", "rows scan error", rowerr, dbName, keyList, valueList) |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
scanArgs := make([]interface{}, len(columns)) |
|
|
|
values := make([]interface{}, len(columns)) |
|
|
|
|
|
|
|
for i := range values { |
|
|
|
scanArgs[i] = &values[i] |
|
|
|
} |
|
|
|
|
|
|
|
for rows.Next() { |
|
|
|
rowerr = rows.Scan(scanArgs...) |
|
|
|
if rowerr == nil { |
|
|
|
for i, col := range values { |
|
|
|
if col != nil { |
|
|
|
index = helper.StrFirstToUpper(columns[i]) |
|
|
|
info[index] = helper.ToString(col) |
|
|
|
} |
|
|
|
} |
|
|
|
count++ |
|
|
|
} else { |
|
|
|
log.Println("ERROR", "rows scan error", rowerr, dbName, keyList, valueList) |
|
|
|
} |
|
|
|
count++ |
|
|
|
} else { |
|
|
|
log.Println("ERROR", "rows scan error", rowerr, dbName, keyList, valueList) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if rowerr != nil { |
|
|
|
return count, info, rowerr |
|
|
|
} |
|
|
|
@ -302,7 +378,6 @@ func GetRow(dbName, table_name, alias string, titles string, with, join [][]stri |
|
|
|
if dbName == "" && table_name == "" { |
|
|
|
return count, info, errors.New("没有数据表") |
|
|
|
} |
|
|
|
|
|
|
|
table := "" |
|
|
|
withSql := "" |
|
|
|
if len(with) > 0 { |
|
|
|
@ -354,6 +429,7 @@ func GetRow(dbName, table_name, alias string, titles string, with, join [][]stri |
|
|
|
if len(join) > 0 { |
|
|
|
var builder strings.Builder |
|
|
|
builder.WriteString(sql_str) |
|
|
|
boo := false |
|
|
|
for _, joinitem := range join { |
|
|
|
if len(joinitem) < 2 { |
|
|
|
continue |
|
|
|
@ -372,8 +448,9 @@ func GetRow(dbName, table_name, alias string, titles string, with, join [][]stri |
|
|
|
} |
|
|
|
builder.WriteString(" on ") |
|
|
|
builder.WriteString(joinitem[1]) |
|
|
|
boo = true |
|
|
|
} |
|
|
|
if builder.Len() > 0 { |
|
|
|
if boo { |
|
|
|
sql_str = builder.String() |
|
|
|
} |
|
|
|
} |
|
|
|
@ -399,10 +476,10 @@ func GetRow(dbName, table_name, alias string, titles string, with, join [][]stri |
|
|
|
if orderby != "" { |
|
|
|
sql_str = helper.StringJoin(sql_str, " order by ", orderby) |
|
|
|
} |
|
|
|
|
|
|
|
if debug { |
|
|
|
log.Println("query sql:", sql_str, valueList) |
|
|
|
} |
|
|
|
|
|
|
|
condition_len := 0 //所有条件数
|
|
|
|
for _, ch2 := range sql_str { |
|
|
|
if string(ch2) == "?" { |
|
|
|
@ -428,6 +505,12 @@ func GetRow(dbName, table_name, alias string, titles string, with, join [][]stri |
|
|
|
} |
|
|
|
|
|
|
|
for queryNum < 2 { //如发生错误,继续查询2次,防止数据库连接断开问题
|
|
|
|
if DB_PROVIDER == "PgsqlDb" { |
|
|
|
sql_str = sqlx.Rebind(sqlx.DOLLAR, sql_str) |
|
|
|
sql_str = ReplaeByOtherSql(sql_str, "PgsqlDb", "") |
|
|
|
} else if DB_PROVIDER == "DmSql" { |
|
|
|
sql_str = ReplaeByOtherSql(sql_str, "DmSql", "") |
|
|
|
} |
|
|
|
|
|
|
|
rows, err = db.Query(sql_str, valueList...) |
|
|
|
|
|
|
|
@ -447,30 +530,63 @@ func GetRow(dbName, table_name, alias string, titles string, with, join [][]stri |
|
|
|
return count, info, err |
|
|
|
} |
|
|
|
|
|
|
|
var index string |
|
|
|
var rowerr error |
|
|
|
columns, _ := rows.Columns() |
|
|
|
scanArgs := make([]interface{}, len(columns)) |
|
|
|
values := make([]interface{}, len(columns)) |
|
|
|
|
|
|
|
for i := range values { |
|
|
|
scanArgs[i] = &values[i] |
|
|
|
} |
|
|
|
if DB_PROVIDER == "DmSql" { |
|
|
|
columnTypes, _ := rows.ColumnTypes() |
|
|
|
scanArgs := make([]interface{}, len(columns)) |
|
|
|
|
|
|
|
var index string |
|
|
|
var rowerr error |
|
|
|
for rows.Next() { |
|
|
|
rowerr = rows.Scan(scanArgs...) |
|
|
|
if rowerr == nil { |
|
|
|
for i, col := range values { |
|
|
|
if col != nil { |
|
|
|
index = helper.StrFirstToUpper(columns[i]) |
|
|
|
info[index] = helper.ToString(col) |
|
|
|
for i, colType := range columnTypes { |
|
|
|
//fmt.Printf("字段: %s, 数据库类型: %s, 扫描类型: %v\n", columns[i], colType.DatabaseTypeName(), colType.ScanType())
|
|
|
|
// 为 DECIMAL 类型创建专用的扫描变量,达梦8中如果只少于1时,前面0会丢失
|
|
|
|
if colType.DatabaseTypeName() == "DECIMAL" { |
|
|
|
var decimalStr sql.RawBytes |
|
|
|
scanArgs[i] = &decimalStr |
|
|
|
} else { |
|
|
|
var val interface{} |
|
|
|
scanArgs[i] = &val |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
for rows.Next() { |
|
|
|
rowerr = rows.Scan(scanArgs...) |
|
|
|
if rowerr == nil { |
|
|
|
for i, col := range scanArgs { |
|
|
|
if col != nil { |
|
|
|
index = helper.StrFirstToUpper(strings.ToLower(columns[i])) |
|
|
|
info[index] = DmFormatDecimal(col) |
|
|
|
} |
|
|
|
} |
|
|
|
count++ |
|
|
|
} else { |
|
|
|
log.Println("ERROR", rowerr) |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
scanArgs := make([]interface{}, len(columns)) |
|
|
|
values := make([]interface{}, len(columns)) |
|
|
|
|
|
|
|
for i := range values { |
|
|
|
scanArgs[i] = &values[i] |
|
|
|
} |
|
|
|
for rows.Next() { |
|
|
|
rowerr = rows.Scan(scanArgs...) |
|
|
|
if rowerr == nil { |
|
|
|
for i, col := range values { |
|
|
|
if col != nil { |
|
|
|
index = helper.StrFirstToUpper(columns[i]) |
|
|
|
info[index] = helper.ToString(col) |
|
|
|
} |
|
|
|
} |
|
|
|
count++ |
|
|
|
} else { |
|
|
|
log.Println("ERROR", rowerr) |
|
|
|
} |
|
|
|
count++ |
|
|
|
} else { |
|
|
|
log.Println("ERROR", rowerr) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
rows.Close() |
|
|
|
if rowerr != nil { |
|
|
|
log.Println("DB row error:", rowerr) |
|
|
|
@ -544,11 +660,11 @@ func FetchRows(dbName, table_name, alias string, titles string, with, join [][]s |
|
|
|
if len(join) > 0 { |
|
|
|
var builder strings.Builder |
|
|
|
builder.WriteString(sql_str) |
|
|
|
boo := false |
|
|
|
for _, joinitem := range join { |
|
|
|
if len(joinitem) < 2 { |
|
|
|
continue |
|
|
|
} |
|
|
|
|
|
|
|
builder.WriteString(" ") |
|
|
|
if len(joinitem) >= 3 { |
|
|
|
builder.WriteString(joinitem[2]) |
|
|
|
@ -563,8 +679,9 @@ func FetchRows(dbName, table_name, alias string, titles string, with, join [][]s |
|
|
|
} |
|
|
|
builder.WriteString(" on ") |
|
|
|
builder.WriteString(joinitem[1]) |
|
|
|
boo = true |
|
|
|
} |
|
|
|
if builder.Len() > 0 { |
|
|
|
if boo { |
|
|
|
sql_str = builder.String() |
|
|
|
} |
|
|
|
} |
|
|
|
@ -593,7 +710,6 @@ func FetchRows(dbName, table_name, alias string, titles string, with, join [][]s |
|
|
|
} |
|
|
|
|
|
|
|
if page > 0 || page_size > 0 { |
|
|
|
|
|
|
|
if page < 1 { |
|
|
|
page = 1 |
|
|
|
} |
|
|
|
@ -603,7 +719,11 @@ func FetchRows(dbName, table_name, alias string, titles string, with, join [][]s |
|
|
|
from := strconv.Itoa((page - 1) * page_size) |
|
|
|
offset := strconv.Itoa(page_size) |
|
|
|
if from != "" && offset != "" { |
|
|
|
sql_str = helper.StringJoin(sql_str, " limit ", from, " , ", offset) |
|
|
|
if DB_PROVIDER == "PgsqlDb" { |
|
|
|
sql_str = helper.StringJoin(sql_str, " limit ", offset, " OFFSET ", from) |
|
|
|
} else { |
|
|
|
sql_str = helper.StringJoin(sql_str, " limit ", from, " , ", offset) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
if debug { |
|
|
|
@ -629,7 +749,12 @@ func FetchRows(dbName, table_name, alias string, titles string, with, join [][]s |
|
|
|
var err error |
|
|
|
var queryNum int = 0 |
|
|
|
for queryNum < 2 { //如发生错误,继续查询2次,防止数据库连接断开问题
|
|
|
|
|
|
|
|
if DB_PROVIDER == "PgsqlDb" { |
|
|
|
sql_str = sqlx.Rebind(sqlx.DOLLAR, sql_str) |
|
|
|
sql_str = ReplaeByOtherSql(sql_str, "PgsqlDb", "") |
|
|
|
} else if DB_PROVIDER == "DmSql" { |
|
|
|
sql_str = ReplaeByOtherSql(sql_str, "DmSql", "") |
|
|
|
} |
|
|
|
rows, err = db.Query(sql_str, valueList...) |
|
|
|
|
|
|
|
if err == nil { |
|
|
|
@ -647,34 +772,71 @@ func FetchRows(dbName, table_name, alias string, titles string, with, join [][]s |
|
|
|
return 0, list, err |
|
|
|
} |
|
|
|
|
|
|
|
columns, _ := rows.Columns() |
|
|
|
scanArgs := make([]interface{}, len(columns)) |
|
|
|
values := make([]interface{}, len(columns)) |
|
|
|
|
|
|
|
for i := range values { |
|
|
|
scanArgs[i] = &values[i] |
|
|
|
} |
|
|
|
|
|
|
|
var index string |
|
|
|
var rowerr error |
|
|
|
var info map[string]string |
|
|
|
|
|
|
|
for rows.Next() { |
|
|
|
rowerr = rows.Scan(scanArgs...) |
|
|
|
info = make(map[string]string) |
|
|
|
if rowerr == nil { |
|
|
|
for i, col := range values { |
|
|
|
if col != nil { |
|
|
|
index = helper.StrFirstToUpper(columns[i]) |
|
|
|
info[index] = helper.ToString(col) |
|
|
|
columns, _ := rows.Columns() |
|
|
|
|
|
|
|
if DB_PROVIDER == "DmSql" { |
|
|
|
columnTypes, _ := rows.ColumnTypes() |
|
|
|
scanArgs := make([]interface{}, len(columns)) |
|
|
|
|
|
|
|
for i, colType := range columnTypes { |
|
|
|
//fmt.Printf("字段: %s, 数据库类型: %s, 扫描类型: %v\n", columns[i], colType.DatabaseTypeName(), colType.ScanType())
|
|
|
|
// 为 DECIMAL 类型创建专用的扫描变量,达梦8中如果只少于1时,前面0会丢失
|
|
|
|
if colType.DatabaseTypeName() == "DECIMAL" { |
|
|
|
var decimalStr sql.RawBytes |
|
|
|
scanArgs[i] = &decimalStr |
|
|
|
} else { |
|
|
|
var val interface{} |
|
|
|
scanArgs[i] = &val |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
for rows.Next() { |
|
|
|
rowerr = rows.Scan(scanArgs...) |
|
|
|
info = make(map[string]string) |
|
|
|
if rowerr == nil { |
|
|
|
for i, col := range scanArgs { |
|
|
|
if col != nil { |
|
|
|
index = helper.StrFirstToUpper(strings.ToLower(columns[i])) |
|
|
|
info[index] = DmFormatDecimal(col) |
|
|
|
} |
|
|
|
} |
|
|
|
count++ |
|
|
|
} else { |
|
|
|
log.Println("ERROR", rowerr) |
|
|
|
} |
|
|
|
if len(info) > 0 { |
|
|
|
list = append(list, info) |
|
|
|
} |
|
|
|
count++ |
|
|
|
} else { |
|
|
|
log.Println("ERROR", rowerr) |
|
|
|
} |
|
|
|
if len(info) > 0 { |
|
|
|
list = append(list, info) |
|
|
|
} else { |
|
|
|
scanArgs := make([]interface{}, len(columns)) |
|
|
|
values := make([]interface{}, len(columns)) |
|
|
|
|
|
|
|
for i := range values { |
|
|
|
scanArgs[i] = &values[i] |
|
|
|
} |
|
|
|
|
|
|
|
for rows.Next() { |
|
|
|
rowerr = rows.Scan(scanArgs...) |
|
|
|
info = make(map[string]string) |
|
|
|
if rowerr == nil { |
|
|
|
for i, col := range values { |
|
|
|
if col != nil { |
|
|
|
index = helper.StrFirstToUpper(columns[i]) |
|
|
|
info[index] = helper.ToString(col) |
|
|
|
} |
|
|
|
} |
|
|
|
count++ |
|
|
|
} else { |
|
|
|
log.Println("ERROR", rowerr) |
|
|
|
} |
|
|
|
if len(info) > 0 { |
|
|
|
list = append(list, info) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -707,7 +869,6 @@ func GetList(dbName, table string, title string, where map[string]string, limit |
|
|
|
if dbName == "" && table == "" { |
|
|
|
return list, errors.New("没有数据表") |
|
|
|
} |
|
|
|
|
|
|
|
if strings.Contains(table, "select ") { |
|
|
|
dbName = table |
|
|
|
} else { |
|
|
|
@ -735,7 +896,12 @@ func GetList(dbName, table string, title string, where map[string]string, limit |
|
|
|
from = limit["from"] |
|
|
|
} |
|
|
|
if offset != "0" && from != "" { |
|
|
|
limitStr += " limit " + from + "," + offset |
|
|
|
|
|
|
|
if DB_PROVIDER == "PgsqlDb" { |
|
|
|
limitStr += " limit " + offset + " OFFSET " + from |
|
|
|
} else { |
|
|
|
limitStr += " limit " + from + "," + offset |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -769,8 +935,15 @@ func GetList(dbName, table string, title string, where map[string]string, limit |
|
|
|
} |
|
|
|
|
|
|
|
for queryNum < 5 { //如发生错误,继续查询5次,防止数据库连接断开问题
|
|
|
|
|
|
|
|
rows, err = DB.Query("select "+title+" from "+dbName+" where "+strings.Join(whereStr, " and ")+" "+limitStr, valueList...) |
|
|
|
var Sql string |
|
|
|
Sql = "select " + title + " from " + dbName + " where " + strings.Join(whereStr, " and ") + " " + limitStr |
|
|
|
if DB_PROVIDER == "PgsqlDb" { |
|
|
|
Sql = sqlx.Rebind(sqlx.DOLLAR, Sql) |
|
|
|
Sql = ReplaeByOtherSql(Sql, "PgsqlDb", "") |
|
|
|
} else if DB_PROVIDER == "DmSql" { |
|
|
|
Sql = ReplaeByOtherSql(Sql, "DmSql", "") |
|
|
|
} |
|
|
|
rows, err = DB.Query(Sql, valueList...) |
|
|
|
|
|
|
|
if err == nil { |
|
|
|
break |
|
|
|
@ -799,27 +972,59 @@ func GetList(dbName, table string, title string, where map[string]string, limit |
|
|
|
} |
|
|
|
defer rows.Close() |
|
|
|
|
|
|
|
columns, _ := rows.Columns() |
|
|
|
scanArgs := make([]interface{}, len(columns)) |
|
|
|
values := make([]interface{}, len(columns)) |
|
|
|
for i := range values { |
|
|
|
scanArgs[i] = &values[i] |
|
|
|
} |
|
|
|
|
|
|
|
var record map[string]string |
|
|
|
var index string |
|
|
|
for rows.Next() { |
|
|
|
//将行数据保存到record字典
|
|
|
|
err = rows.Scan(scanArgs...) |
|
|
|
record = make(map[string]string) |
|
|
|
columns, _ := rows.Columns() |
|
|
|
|
|
|
|
for i, col := range values { |
|
|
|
if col != nil { |
|
|
|
index = helper.StrFirstToUpper(columns[i]) |
|
|
|
record[index] = helper.ToString(col) |
|
|
|
if DB_PROVIDER == "DmSql" { |
|
|
|
columnTypes, _ := rows.ColumnTypes() |
|
|
|
scanArgs := make([]interface{}, len(columns)) |
|
|
|
|
|
|
|
for i, colType := range columnTypes { |
|
|
|
//fmt.Printf("字段: %s, 数据库类型: %s, 扫描类型: %v\n", columns[i], colType.DatabaseTypeName(), colType.ScanType())
|
|
|
|
// 为 DECIMAL 类型创建专用的扫描变量,达梦8中如果只少于1时,前面0会丢失
|
|
|
|
if colType.DatabaseTypeName() == "DECIMAL" { |
|
|
|
var decimalStr sql.RawBytes |
|
|
|
scanArgs[i] = &decimalStr |
|
|
|
} else { |
|
|
|
var val interface{} |
|
|
|
scanArgs[i] = &val |
|
|
|
} |
|
|
|
} |
|
|
|
list = append(list, record) |
|
|
|
|
|
|
|
for rows.Next() { |
|
|
|
//将行数据保存到record字典
|
|
|
|
err = rows.Scan(scanArgs...) |
|
|
|
record = make(map[string]string) |
|
|
|
|
|
|
|
for i, col := range scanArgs { |
|
|
|
if col != nil { |
|
|
|
index = helper.StrFirstToUpper(strings.ToLower(columns[i])) |
|
|
|
record[index] = DmFormatDecimal(col) |
|
|
|
} |
|
|
|
} |
|
|
|
list = append(list, record) |
|
|
|
} |
|
|
|
} else { |
|
|
|
scanArgs := make([]interface{}, len(columns)) |
|
|
|
values := make([]interface{}, len(columns)) |
|
|
|
for i := range values { |
|
|
|
scanArgs[i] = &values[i] |
|
|
|
} |
|
|
|
|
|
|
|
for rows.Next() { |
|
|
|
//将行数据保存到record字典
|
|
|
|
err = rows.Scan(scanArgs...) |
|
|
|
record = make(map[string]string) |
|
|
|
|
|
|
|
for i, col := range values { |
|
|
|
if col != nil { |
|
|
|
index = helper.StrFirstToUpper(columns[i]) |
|
|
|
record[index] = helper.ToString(col) |
|
|
|
} |
|
|
|
} |
|
|
|
list = append(list, record) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return list, nil |
|
|
|
@ -834,7 +1039,6 @@ func GetTotal(dbName, table string, args ...string) (total int) { |
|
|
|
if dbName == "" && table == "" { |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
if strings.Contains(table, "select ") { |
|
|
|
dbName = table |
|
|
|
} else { |
|
|
|
@ -852,7 +1056,6 @@ func GetTotal(dbName, table string, args ...string) (total int) { |
|
|
|
var queryNum int = 0 |
|
|
|
|
|
|
|
for queryNum < 5 { //如发生错误,继续查询5次,防止数据库连接断开问题
|
|
|
|
|
|
|
|
rows, err = DB.Query("select count(" + title + ") as count from " + dbName + " limit 1") |
|
|
|
|
|
|
|
if err == nil { |
|
|
|
@ -936,7 +1139,15 @@ func GetCount(dbName, table string, where map[string]string, args ...string) (to |
|
|
|
|
|
|
|
for queryNum < 5 { //如发生错误,继续查询5次,防止数据库连接断开问题
|
|
|
|
|
|
|
|
rows, err = DB.Query("select count("+title+") as count from "+dbName+" where "+strings.Join(whereStr, " and ")+" limit 1", valueList...) |
|
|
|
var Sql string |
|
|
|
Sql = "select count(" + title + ") as count from " + dbName + " where " + strings.Join(whereStr, " and ") + " limit 1" |
|
|
|
if DB_PROVIDER == "PgsqlDb" { |
|
|
|
Sql = sqlx.Rebind(sqlx.DOLLAR, Sql) |
|
|
|
Sql = ReplaeByOtherSql(Sql, "PgsqlDb", "") |
|
|
|
} else if DB_PROVIDER == "DmSql" { |
|
|
|
Sql = ReplaeByOtherSql(Sql, "DmSql", "") |
|
|
|
} |
|
|
|
rows, err = DB.Query(Sql, valueList...) |
|
|
|
|
|
|
|
if err == nil { |
|
|
|
break |
|
|
|
@ -995,6 +1206,12 @@ func DoQuery(args ...interface{}) ([]map[string]string, error) { |
|
|
|
|
|
|
|
for queryNum < 3 { //如发生错误,继续查询5次,防止数据库连接断开问题
|
|
|
|
if len(args) > 1 { |
|
|
|
if DB_PROVIDER == "PgsqlDb" { |
|
|
|
queryStr = sqlx.Rebind(sqlx.DOLLAR, queryStr) |
|
|
|
queryStr = ReplaeByOtherSql(queryStr, "PgsqlDb", "") |
|
|
|
} else if DB_PROVIDER == "DmSql" { |
|
|
|
queryStr = ReplaeByOtherSql(queryStr, "DmSql", "") |
|
|
|
} |
|
|
|
rows, err = DB.Query(queryStr, args[1:]...) //strings.Join(args[1:], ",")
|
|
|
|
if err != nil { |
|
|
|
log.Println("ERROR|DoQuery error:", err) |
|
|
|
@ -1019,27 +1236,59 @@ func DoQuery(args ...interface{}) ([]map[string]string, error) { |
|
|
|
} |
|
|
|
defer rows.Close() |
|
|
|
|
|
|
|
columns, _ := rows.Columns() |
|
|
|
scanArgs := make([]interface{}, len(columns)) |
|
|
|
values := make([]interface{}, len(columns)) |
|
|
|
for i := range values { |
|
|
|
scanArgs[i] = &values[i] |
|
|
|
} |
|
|
|
|
|
|
|
var record map[string]string |
|
|
|
var index string |
|
|
|
for rows.Next() { |
|
|
|
//将行数据保存到record字典
|
|
|
|
err = rows.Scan(scanArgs...) |
|
|
|
record = make(map[string]string) |
|
|
|
columns, _ := rows.Columns() |
|
|
|
|
|
|
|
if DB_PROVIDER == "DmSql" { |
|
|
|
columnTypes, _ := rows.ColumnTypes() |
|
|
|
scanArgs := make([]interface{}, len(columns)) |
|
|
|
|
|
|
|
for i, colType := range columnTypes { |
|
|
|
//fmt.Printf("字段: %s, 数据库类型: %s, 扫描类型: %v\n", columns[i], colType.DatabaseTypeName(), colType.ScanType())
|
|
|
|
// 为 DECIMAL 类型创建专用的扫描变量,达梦8中如果只少于1时,前面0会丢失
|
|
|
|
if colType.DatabaseTypeName() == "DECIMAL" { |
|
|
|
var decimalStr sql.RawBytes |
|
|
|
scanArgs[i] = &decimalStr |
|
|
|
} else { |
|
|
|
var val interface{} |
|
|
|
scanArgs[i] = &val |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
for rows.Next() { |
|
|
|
//将行数据保存到record字典
|
|
|
|
err = rows.Scan(scanArgs...) |
|
|
|
record = make(map[string]string) |
|
|
|
|
|
|
|
for i, col := range scanArgs { |
|
|
|
if col != nil { |
|
|
|
index = helper.StrFirstToUpper(strings.ToLower(columns[i])) |
|
|
|
record[index] = DmFormatDecimal(col) |
|
|
|
} |
|
|
|
} |
|
|
|
list = append(list, record) |
|
|
|
} |
|
|
|
} else { |
|
|
|
scanArgs := make([]interface{}, len(columns)) |
|
|
|
values := make([]interface{}, len(columns)) |
|
|
|
for i := range values { |
|
|
|
scanArgs[i] = &values[i] |
|
|
|
} |
|
|
|
|
|
|
|
for i, col := range values { |
|
|
|
if col != nil { |
|
|
|
index = helper.StrFirstToUpper(columns[i]) |
|
|
|
record[index] = helper.ToString(col) |
|
|
|
for rows.Next() { |
|
|
|
//将行数据保存到record字典
|
|
|
|
err = rows.Scan(scanArgs...) |
|
|
|
record = make(map[string]string) |
|
|
|
|
|
|
|
for i, col := range values { |
|
|
|
if col != nil { |
|
|
|
index = helper.StrFirstToUpper(columns[i]) |
|
|
|
record[index] = helper.ToString(col) |
|
|
|
} |
|
|
|
} |
|
|
|
list = append(list, record) |
|
|
|
} |
|
|
|
list = append(list, record) |
|
|
|
} |
|
|
|
|
|
|
|
return list, nil |
|
|
|
|