|
|
@ -71,6 +71,8 @@ func (this *Query) Db(dbname string) *Query { |
|
|
|
this.dbname = dbname |
|
|
|
if DB_PROVIDER == "PgsqlDb" { |
|
|
|
this.dbname = "" |
|
|
|
} else if DB_PROVIDER == "DmSql" { |
|
|
|
this.dbname = "" |
|
|
|
} |
|
|
|
return this |
|
|
|
} |
|
|
@ -225,19 +227,55 @@ func (this *Query) GetTableInfo(table string) (map[string]interface{}, error) { |
|
|
|
"COLUMN_COMMENT", //备注
|
|
|
|
"IS_NULLABLE", //是否为空
|
|
|
|
} |
|
|
|
sql := "select `" + strings.Join(field, "`,`") + "` from information_schema.COLUMNS where table_name = ? and table_schema = ?" |
|
|
|
if this.conn == nil { |
|
|
|
this.conn = DB |
|
|
|
} |
|
|
|
sql := "select `" + strings.Join(field, "`,`") + "` from information_schema.COLUMNS where table_name = ?" |
|
|
|
|
|
|
|
if DB_PROVIDER == "PgsqlDb" { |
|
|
|
//pgsql中,未加引号的标识符会被自动转换为小写
|
|
|
|
sql = `SELECT |
|
|
|
c.column_name AS 'COLUMN_NAME', |
|
|
|
c.column_default AS 'COLUMN_DEFAULT', |
|
|
|
c.data_type AS 'DATA_TYPE', |
|
|
|
c.udt_name AS 'COLUMN_TYPE', |
|
|
|
pgdesc.description AS 'COLUMN_COMMENT', |
|
|
|
c.is_nullable AS 'IS_NULLABLE' |
|
|
|
FROM |
|
|
|
information_schema.columns c |
|
|
|
LEFT JOIN |
|
|
|
pg_catalog.pg_statio_all_tables st ON st.schemaname = c.table_schema AND st.relname = c.table_name |
|
|
|
LEFT JOIN |
|
|
|
pg_catalog.pg_description pgdesc ON pgdesc.objoid = st.relid AND pgdesc.objsubid = c.ordinal_position |
|
|
|
WHERE |
|
|
|
c.table_name = ?` |
|
|
|
|
|
|
|
sql = sqlx.Rebind(sqlx.DOLLAR, sql) |
|
|
|
sql = SqlReplace(sql, "") |
|
|
|
} else if DB_PROVIDER == "DmSql" { |
|
|
|
sql = `SELECT |
|
|
|
COLUMN_NAME, |
|
|
|
DATA_DEFAULT AS COLUMN_DEFAULT, |
|
|
|
DATA_TYPE, |
|
|
|
CASE |
|
|
|
WHEN DATA_TYPE LIKE '%CHAR%' OR DATA_TYPE LIKE '%TEXT%' THEN DATA_TYPE || '(' || CHAR_LENGTH || ')' |
|
|
|
WHEN DATA_TYPE IN ('NUMERIC', 'DECIMAL') THEN DATA_TYPE || '(' || DATA_PRECISION || ',' || DATA_SCALE || ')' |
|
|
|
ELSE DATA_TYPE |
|
|
|
END AS COLUMN_TYPE, |
|
|
|
'' AS COLUMN_COMMENT, |
|
|
|
CASE NULLABLE WHEN 'Y' THEN 'YES' WHEN 'N' THEN 'NO' END AS IS_NULLABLE |
|
|
|
FROM |
|
|
|
ALL_TAB_COLUMNS |
|
|
|
WHERE |
|
|
|
TABLE_NAME = ?` |
|
|
|
} |
|
|
|
|
|
|
|
if this.conn == nil { |
|
|
|
this.conn = DB |
|
|
|
} |
|
|
|
|
|
|
|
stmtSql, err := this.conn.Prepare(sql) |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
list, err := StmtForQueryList(stmtSql, []interface{}{table, this.dbname}) |
|
|
|
|
|
|
|
list, err := StmtForQueryList(stmtSql, []interface{}{table}) |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
@ -254,6 +292,10 @@ func (this *Query) GetTableInfo(table string) (map[string]interface{}, error) { |
|
|
|
} |
|
|
|
for _, k := range field { |
|
|
|
index := helper.StrFirstToUpper(k) |
|
|
|
if DB_PROVIDER == "DmSql" { |
|
|
|
index = helper.StrFirstToUpper(strings.ToLower(k)) |
|
|
|
} |
|
|
|
|
|
|
|
if v, ok := item[index]; ok { |
|
|
|
switch k { |
|
|
|
case "COLUMN_NAME": |
|
|
@ -442,7 +484,9 @@ func (this *Query) BuildSelectSql() (map[string]interface{}, error) { |
|
|
|
} |
|
|
|
if DB_PROVIDER == "PgsqlDb" { |
|
|
|
sql = sqlx.Rebind(sqlx.DOLLAR, sql) |
|
|
|
sql = SqlReplace(sql, "") |
|
|
|
sql = ReplaeByOtherSql(sql, "PgsqlDb", "") |
|
|
|
} else if DB_PROVIDER == "DmSql" { |
|
|
|
sql = ReplaeByOtherSql(sql, "DmSql", "") |
|
|
|
} |
|
|
|
return map[string]interface{}{ |
|
|
|
"sql": sql, |
|
|
@ -517,7 +561,9 @@ func (this *Query) UpdateStmt() error { |
|
|
|
} |
|
|
|
if DB_PROVIDER == "PgsqlDb" { |
|
|
|
sql = sqlx.Rebind(sqlx.DOLLAR, sql) |
|
|
|
sql = SqlReplace(sql, "") |
|
|
|
sql = ReplaeByOtherSql(sql, "PgsqlDb", "") |
|
|
|
} else if DB_PROVIDER == "DmSql" { |
|
|
|
sql = ReplaeByOtherSql(sql, "DmSql", "") |
|
|
|
} |
|
|
|
stmt, err = this.conn.Prepare(sql) |
|
|
|
|
|
|
@ -543,8 +589,11 @@ func (this *Query) UpdateAllStmt() error { |
|
|
|
var dataSql []string //一组用到的占位字符
|
|
|
|
var valSql []string //占位字符组
|
|
|
|
var updSql []string //更新字段的sql
|
|
|
|
var updSql_dm []string //更新字段的sql--达梦和高斯用
|
|
|
|
var updFieldLen = len(this.upd_field) //需要更新的字段数量,为0时更新除id外添加值
|
|
|
|
|
|
|
|
dataLen := len(this.save_data) |
|
|
|
|
|
|
|
if dataLen > 0 { |
|
|
|
//批量操作
|
|
|
|
this.data = this.data[0:0] |
|
|
@ -562,11 +611,14 @@ func (this *Query) UpdateAllStmt() error { |
|
|
|
case 0: |
|
|
|
//预览创建数据的长度
|
|
|
|
updSql = make([]string, 0, fieldLen) |
|
|
|
updSql_dm = make([]string, 0, fieldLen) |
|
|
|
default: |
|
|
|
//按照需要更新字段数长度
|
|
|
|
updSql = make([]string, 0, updFieldLen) |
|
|
|
updSql_dm = make([]string, 0, updFieldLen) |
|
|
|
for _, k := range this.upd_field { |
|
|
|
updSql = append(updSql, k+"=values("+k+")") //存储需要更新的字段
|
|
|
|
updSql_dm = append(updSql_dm, k+"=s."+k+"") //存储需要更新的字段
|
|
|
|
} |
|
|
|
} |
|
|
|
for k := range this.save_data[i] { |
|
|
@ -574,6 +626,7 @@ func (this *Query) UpdateAllStmt() error { |
|
|
|
dataSql = append(dataSql, "?") //存储需要的占位符
|
|
|
|
if updFieldLen == 0 && k != "id" { |
|
|
|
updSql = append(updSql, k+"=values("+k+")") //存储需要更新的字段
|
|
|
|
updSql_dm = append(updSql_dm, k+"=s."+k+"") //存储需要更新的字段
|
|
|
|
} |
|
|
|
} |
|
|
|
dataSqlText = strings.Join(dataSql, ",") //组成每组占位字符格式
|
|
|
@ -591,21 +644,26 @@ func (this *Query) UpdateAllStmt() error { |
|
|
|
switch updFieldLen { |
|
|
|
case 0: |
|
|
|
updSql = make([]string, 0, fieldLen) |
|
|
|
updSql_dm = make([]string, 0, fieldLen) |
|
|
|
default: |
|
|
|
updSql = make([]string, 0, updFieldLen) |
|
|
|
updSql_dm = make([]string, 0, updFieldLen) |
|
|
|
for _, k := range this.upd_field { |
|
|
|
updSql = append(updSql, k+"=values("+k+")") |
|
|
|
updSql_dm = append(updSql_dm, k+"=s."+k+"") |
|
|
|
} |
|
|
|
} |
|
|
|
for i := 0; i < fieldLen; i++ { |
|
|
|
dataSql = append(dataSql, "?") |
|
|
|
if updFieldLen == 0 && this.data[i] != "id" { |
|
|
|
updSql = append(updSql, this.data[i]+"=values("+this.data[i]+")") |
|
|
|
updSql_dm = append(updSql_dm, this.data[i]+"=s."+this.data[i]+"") |
|
|
|
} |
|
|
|
} |
|
|
|
if updFieldLen > 0 { |
|
|
|
for _, k := range this.upd_field { |
|
|
|
updSql = append(updSql, k+"=values("+k+")") |
|
|
|
updSql_dm = append(updSql_dm, k+"=s."+k+"") |
|
|
|
} |
|
|
|
} |
|
|
|
valSql = append(valSql, "("+strings.Join(dataSql, " , ")+")") |
|
|
@ -622,10 +680,43 @@ func (this *Query) UpdateAllStmt() error { |
|
|
|
if len(valSql) > 1 { |
|
|
|
setText = " value " |
|
|
|
} |
|
|
|
|
|
|
|
sql = helper.StringJoin("insert into ", dbName, " (", strings.Join(this.data, " , "), ")", setText, strings.Join(valSql, ","), " ON DUPLICATE KEY UPDATE ", strings.Join(updSql, " , ")) |
|
|
|
|
|
|
|
if DB_PROVIDER == "PgsqlDb" { |
|
|
|
setText = " values " |
|
|
|
val_field := addPrefixInField(this.data, "s.") |
|
|
|
|
|
|
|
sql = `merge into ` + dbName + ` as t |
|
|
|
using ( |
|
|
|
` + setText + strings.Join(valSql, ",") + ` |
|
|
|
) s (` + strings.Join(this.data, " , ") + `) |
|
|
|
on (t.id = s.id) |
|
|
|
when matched then |
|
|
|
update set |
|
|
|
` + strings.Join(updSql_dm, " , ") + ` |
|
|
|
when NOT matched then |
|
|
|
insert (` + strings.Join(this.data, " , ") + `) |
|
|
|
values (` + strings.Join(val_field, " , ") + `)` |
|
|
|
} else if DB_PROVIDER == "DmSql" { |
|
|
|
setText = " values " |
|
|
|
val_field := addPrefixInField(this.data, "s.") |
|
|
|
title_field := addPrefixInField(this.data, "? AS ") |
|
|
|
|
|
|
|
sql = `MERGE INTO ` + dbName + ` AS t |
|
|
|
USING ( |
|
|
|
SELECT |
|
|
|
` + strings.Join(title_field, " , ") + ` |
|
|
|
FROM DUAL |
|
|
|
) s |
|
|
|
ON (t.id = s.id) |
|
|
|
WHEN MATCHED THEN |
|
|
|
UPDATE SET |
|
|
|
` + strings.Join(updSql_dm, " , ") + ` |
|
|
|
WHEN NOT MATCHED THEN |
|
|
|
INSERT (` + strings.Join(this.data, " , ") + `) |
|
|
|
VALUES (` + strings.Join(val_field, " , ") + `)` |
|
|
|
} |
|
|
|
sql = helper.StringJoin("insert into ", dbName, " (", strings.Join(this.data, " , "), ")", setText, strings.Join(valSql, ","), " ON DUPLICATE KEY UPDATE ", strings.Join(updSql, " , ")) |
|
|
|
|
|
|
|
if this.debug { |
|
|
|
log.Println("insert on duplicate key update sql:", sql, this.value) |
|
|
@ -645,7 +736,9 @@ func (this *Query) UpdateAllStmt() error { |
|
|
|
} |
|
|
|
if DB_PROVIDER == "PgsqlDb" { |
|
|
|
sql = sqlx.Rebind(sqlx.DOLLAR, sql) |
|
|
|
sql = SqlReplace(sql, "") |
|
|
|
sql = ReplaeByOtherSql(sql, "PgsqlDb", "") |
|
|
|
} else if DB_PROVIDER == "DmSql" { |
|
|
|
sql = ReplaeByOtherSql(sql, "DmSql", "") |
|
|
|
} |
|
|
|
stmt, err = this.conn.Prepare(sql) |
|
|
|
|
|
|
@ -719,6 +812,8 @@ func (this *Query) CreateAllStmt() error { |
|
|
|
} |
|
|
|
if DB_PROVIDER == "PgsqlDb" { |
|
|
|
setText = " values " |
|
|
|
} else if DB_PROVIDER == "DmSql" { |
|
|
|
setText = " values " |
|
|
|
} |
|
|
|
sql = helper.StringJoin("insert into ", dbName, " (", strings.Join(this.data, " , "), ")", setText, strings.Join(valSql, ",")) |
|
|
|
|
|
|
@ -740,7 +835,9 @@ func (this *Query) CreateAllStmt() error { |
|
|
|
} |
|
|
|
if DB_PROVIDER == "PgsqlDb" { |
|
|
|
sql = sqlx.Rebind(sqlx.DOLLAR, sql) |
|
|
|
sql = SqlReplace(sql, "add") |
|
|
|
sql = ReplaeByOtherSql(sql, "PgsqlDb", "add") |
|
|
|
} else if DB_PROVIDER == "DmSql" { |
|
|
|
sql = ReplaeByOtherSql(sql, "DmSql", "") |
|
|
|
} |
|
|
|
stmt, err = this.conn.Prepare(sql) |
|
|
|
|
|
|
@ -763,7 +860,7 @@ func (this *Query) CreateStmt() error { |
|
|
|
dbName := getTableName(this.dbname, this.table, this.dbtype) |
|
|
|
|
|
|
|
var sql string |
|
|
|
if DB_PROVIDER == "PgsqlDb" { |
|
|
|
if DB_PROVIDER == "PgsqlDb" || DB_PROVIDER == "DmSql" { |
|
|
|
insert_data := []string{} |
|
|
|
value_data := []string{} |
|
|
|
for _, rv := range this.data { |
|
|
@ -780,7 +877,11 @@ func (this *Query) CreateStmt() error { |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
sql = helper.StringJoin("insert into ", dbName, " ("+strings.Join(insert_data, " , ")+")", " VALUES ", "("+strings.Join(value_data, " , ")+")", " RETURNING id") |
|
|
|
sql = helper.StringJoin("insert into ", dbName, " ("+strings.Join(insert_data, " , ")+")", " VALUES ", "("+strings.Join(value_data, " , ")+")") |
|
|
|
|
|
|
|
if DB_PROVIDER == "PgsqlDb" { |
|
|
|
sql = helper.StringJoin(sql, " RETURNING id") |
|
|
|
} |
|
|
|
} else { |
|
|
|
sql = helper.StringJoin("insert into ", dbName, " set ", strings.Join(this.data, " , ")) |
|
|
|
} |
|
|
@ -804,7 +905,9 @@ func (this *Query) CreateStmt() error { |
|
|
|
} |
|
|
|
if DB_PROVIDER == "PgsqlDb" { |
|
|
|
sql = sqlx.Rebind(sqlx.DOLLAR, sql) |
|
|
|
sql = SqlReplace(sql, "") |
|
|
|
sql = ReplaeByOtherSql(sql, "PgsqlDb", "") |
|
|
|
} else if DB_PROVIDER == "DmSql" { |
|
|
|
sql = ReplaeByOtherSql(sql, "DmSql", "") |
|
|
|
} |
|
|
|
stmt, err = this.conn.Prepare(sql) |
|
|
|
|
|
|
@ -856,7 +959,9 @@ func (this *Query) DeleteStmt() error { |
|
|
|
} |
|
|
|
if DB_PROVIDER == "PgsqlDb" { |
|
|
|
sql = sqlx.Rebind(sqlx.DOLLAR, sql) |
|
|
|
sql = SqlReplace(sql, "") |
|
|
|
sql = ReplaeByOtherSql(sql, "PgsqlDb", "") |
|
|
|
} else if DB_PROVIDER == "DmSql" { |
|
|
|
sql = ReplaeByOtherSql(sql, "DmSql", "") |
|
|
|
} |
|
|
|
stmt, err = this.conn.Prepare(sql) |
|
|
|
|
|
|
|