update readme

This commit is contained in:
tangpanqing
2023-01-11 11:28:04 +08:00
parent aca0d94f63
commit 62d50a6af8
17 changed files with 419 additions and 393 deletions

BIN
README.md

Binary file not shown.

Binary file not shown.

View File

@@ -11,7 +11,7 @@ type FloatStruct struct {
} }
// Count 聚合函数-数量 // Count 聚合函数-数量
func (b *Builder) Count(fieldName string) (int64, error) { func (b *Builder) Count(fieldName interface{}) (int64, error) {
var obj []IntStruct var obj []IntStruct
err := b.SelectCount(fieldName, "c", "").GetMany(&obj) err := b.SelectCount(fieldName, "c", "").GetMany(&obj)
if err != nil { if err != nil {

View File

@@ -37,6 +37,11 @@ type OrderItem struct {
OrderType string OrderType string
} }
type LimitItem struct {
offset int
pageSize int
}
type JoinItem struct { type JoinItem struct {
joinType string joinType string
table interface{} table interface{}

View File

@@ -33,66 +33,55 @@ const RawEq = "RawEq"
// Builder 查询记录所需要的条件 // Builder 查询记录所需要的条件
type Builder struct { type Builder struct {
//数据库操作连接
LinkCommon model.LinkCommon LinkCommon model.LinkCommon
driverName string
table interface{} table interface{}
tableAlias string tableAlias string
//查询参数 selectList []SelectItem
tableName string selectExpList []*SelectExpItem
selectList []SelectItem groupList []GroupItem
selectExpList []*SelectExpItem whereList []WhereItem
groupList []GroupItem joinList []JoinItem
whereList []WhereItem havingList []WhereItem
joinList []JoinItem orderList []OrderItem
havingList []WhereItem limitItem LimitItem
orderList []OrderItem
offset int
pageSize int
distinct bool distinct bool
isDebug bool isDebug bool
isLockForUpdate bool isLockForUpdate bool
//sql与参数 //sql与参数
sql string sql string
paramList []interface{} args []interface{}
//驱动名字
driverName string
} }
func (b *Builder) Distinct(distinct bool) *Builder { // Debug 链式操作-是否开启调试,打印sql
b.distinct = distinct func (b *Builder) Debug(isDebug bool) *Builder {
b.isDebug = isDebug
return b return b
} }
// Driver 驱动类型
func (b *Builder) Driver(driverName string) *Builder { func (b *Builder) Driver(driverName string) *Builder {
b.driverName = driverName b.driverName = driverName
return b return b
} }
func (b *Builder) getTableNameCommon(typeOf reflect.Type, valueOf reflect.Value) string { // Distinct 过滤重复记录
if b.table != nil { func (b *Builder) Distinct(distinct bool) *Builder {
return getTableNameByTable(b.table) b.distinct = distinct
} return b
return getTableNameByReflect(typeOf, valueOf)
} }
func getTagMap(fieldTag string) map[string]string { // Table 链式操作-从哪个表查询,允许直接写别名,例如 person p
var fieldMap = make(map[string]string) func (b *Builder) Table(table interface{}, alias ...string) *Builder {
if "" != fieldTag { b.table = table
tagArr := strings.Split(fieldTag, ";") if len(alias) > 0 {
for j := 0; j < len(tagArr); j++ { b.tableAlias = alias[0]
tagArrArr := strings.Split(tagArr[j], ":")
fieldMap[tagArrArr[0]] = ""
if len(tagArrArr) > 1 {
fieldMap[tagArrArr[0]] = tagArrArr[1]
}
}
} }
return fieldMap return b
} }
// Insert 增加记录 // Insert 增加记录
@@ -104,7 +93,7 @@ func (b *Builder) Insert(dest interface{}) (int64, error) {
var primaryKey = "" var primaryKey = ""
var keys []string var keys []string
var paramList []any var args []any
var place []string var place []string
for i := 0; i < typeOf.Elem().NumField(); i++ { for i := 0; i < typeOf.Elem().NumField(); i++ {
key, tagMap := getFieldNameByReflect(typeOf.Elem().Field(i)) key, tagMap := getFieldNameByReflect(typeOf.Elem().Field(i))
@@ -121,7 +110,7 @@ func (b *Builder) Insert(dest interface{}) (int64, error) {
val := valueOf.Elem().Field(i).Field(0).Field(0).Interface() val := valueOf.Elem().Field(i).Field(0).Field(0).Interface()
keys = append(keys, key) keys = append(keys, key)
paramList = append(paramList, val) args = append(args, val)
place = append(place, "?") place = append(place, "?")
} }
} }
@@ -129,23 +118,23 @@ func (b *Builder) Insert(dest interface{}) (int64, error) {
sqlStr := "INSERT INTO " + b.getTableNameCommon(typeOf, valueOf) + " (" + strings.Join(keys, ",") + ") VALUES (" + strings.Join(place, ",") + ")" sqlStr := "INSERT INTO " + b.getTableNameCommon(typeOf, valueOf) + " (" + strings.Join(keys, ",") + ") VALUES (" + strings.Join(place, ",") + ")"
if b.driverName == model.Mssql { if b.driverName == model.Mssql {
return b.insertForMssqlOrPostgres(sqlStr+"; SELECT SCOPE_IDENTITY()", paramList...) return b.insertForMssqlOrPostgres(sqlStr+"; SELECT SCOPE_IDENTITY()", args...)
} else if b.driverName == model.Postgres { } else if b.driverName == model.Postgres {
sqlStr = convertToPostgresSql(sqlStr) sqlStr = convertToPostgresSql(sqlStr)
return b.insertForMssqlOrPostgres(sqlStr+" RETURNING "+primaryKey, paramList...) return b.insertForMssqlOrPostgres(sqlStr+" RETURNING "+primaryKey, args...)
} else { } else {
return b.insertForCommon(sqlStr, paramList...) return b.insertForCommon(sqlStr, args...)
} }
} }
//对于Mssql,Postgres类型数据库为了获取最后插入的id需要改写入为查询 //对于Mssql,Postgres类型数据库为了获取最后插入的id需要改写入为查询
func (b *Builder) insertForMssqlOrPostgres(sql string, paramList ...any) (int64, error) { func (b *Builder) insertForMssqlOrPostgres(sql string, args ...any) (int64, error) {
if b.isDebug { if b.isDebug {
fmt.Println(sql) fmt.Println(sql)
fmt.Println(paramList...) fmt.Println(args...)
} }
rows, err := b.LinkCommon.Query(sql, paramList...) rows, err := b.LinkCommon.Query(sql, args...)
if err != nil { if err != nil {
return 0, err return 0, err
} }
@@ -158,8 +147,8 @@ func (b *Builder) insertForMssqlOrPostgres(sql string, paramList ...any) (int64,
} }
//对于非Mssql,Postgres类型数据库可以直接获取最后插入的id //对于非Mssql,Postgres类型数据库可以直接获取最后插入的id
func (b *Builder) insertForCommon(sql string, paramList ...any) (int64, error) { func (b *Builder) insertForCommon(sql string, args ...any) (int64, error) {
res, err := b.Exec(sql, paramList...) res, err := b.RawSql(sql, args...).Exec()
if err != nil { if err != nil {
return 0, err return 0, err
} }
@@ -172,24 +161,10 @@ func (b *Builder) insertForCommon(sql string, paramList ...any) (int64, error) {
return lastId, nil return lastId, nil
} }
//对于Postgres数据库不支持?占位符,支持$1,$2类型需要做转换
func convertToPostgresSql(sqlStr string) string {
t := 1
for {
if strings.Index(sqlStr, "?") == -1 {
break
}
sqlStr = strings.Replace(sqlStr, "?", "$"+strconv.Itoa(t), 1)
t += 1
}
return sqlStr
}
// InsertBatch 批量增加记录 // InsertBatch 批量增加记录
func (b *Builder) InsertBatch(values interface{}) (int64, error) { func (b *Builder) InsertBatch(values interface{}) (int64, error) {
var keys []string var keys []string
var paramList []any var args []any
var place []string var place []string
valueOf := reflect.ValueOf(values).Elem() valueOf := reflect.ValueOf(values).Elem()
@@ -211,7 +186,7 @@ func (b *Builder) InsertBatch(values interface{}) (int64, error) {
} }
val := valueOf.Index(j).Elem().Field(i).Field(0).Field(0).Interface() val := valueOf.Index(j).Elem().Field(i).Field(0).Field(0).Interface()
paramList = append(paramList, val) args = append(args, val)
placeItem = append(placeItem, "?") placeItem = append(placeItem, "?")
} }
} }
@@ -225,7 +200,7 @@ func (b *Builder) InsertBatch(values interface{}) (int64, error) {
sqlStr = convertToPostgresSql(sqlStr) sqlStr = convertToPostgresSql(sqlStr)
} }
res, err := b.Exec(sqlStr, paramList...) res, err := b.RawSql(sqlStr, args...).Exec()
if err != nil { if err != nil {
return 0, err return 0, err
} }
@@ -238,24 +213,6 @@ func (b *Builder) InsertBatch(values interface{}) (int64, error) {
return count, nil return count, nil
} }
// GetRows 获取行操作
func (b *Builder) GetRows() (*sql.Rows, error) {
sqlStr, paramList := b.GetSqlAndParams()
smt, errSmt := b.LinkCommon.Prepare(sqlStr)
if errSmt != nil {
return nil, errSmt
}
//defer smt.Close()
rows, errRows := smt.Query(paramList...)
if errRows != nil {
return nil, errRows
}
return rows, nil
}
// GetMany 查询记录(新) // GetMany 查询记录(新)
func (b *Builder) GetMany(values interface{}) error { func (b *Builder) GetMany(values interface{}) error {
rows, errRows := b.GetRows() rows, errRows := b.GetRows()
@@ -324,53 +281,17 @@ func (b *Builder) GetOne(obj interface{}) error {
return nil return nil
} }
// RawSql 执行原始的sql语句
func (b *Builder) RawSql(sql string, paramList ...interface{}) *Builder {
b.sql = sql
b.paramList = paramList
return b
}
func (b *Builder) GetSqlAndParams() (string, []interface{}) {
if b.sql != "" {
return b.sql, b.paramList
}
var paramList []interface{}
tableName := getTableNameByTable(b.table)
fieldStr, paramList := b.handleSelect(paramList)
whereStr, paramList := b.handleWhere(paramList)
joinStr, paramList := b.handleJoin(paramList)
groupStr, paramList := b.handleGroup(paramList)
havingStr, paramList := b.handleHaving(paramList)
orderStr, paramList := b.handleOrder(paramList)
limitStr, paramList := b.handleLimit(paramList)
lockStr := b.handleLockForUpdate()
sql := "SELECT " + fieldStr + " FROM " + tableName + " " + b.tableAlias + joinStr + whereStr + groupStr + havingStr + orderStr + limitStr + lockStr
if b.driverName == model.Postgres {
sql = convertToPostgresSql(sql)
}
if b.isDebug {
fmt.Println(sql)
fmt.Println(paramList...)
}
return sql, paramList
}
// Update 更新记录 // Update 更新记录
func (b *Builder) Update(dest interface{}) (int64, error) { func (b *Builder) Update(dest interface{}) (int64, error) {
typeOf := reflect.TypeOf(dest) typeOf := reflect.TypeOf(dest)
valueOf := reflect.ValueOf(dest) valueOf := reflect.ValueOf(dest)
var paramList []any var args []any
setStr, paramList := b.handleSet(typeOf, valueOf, paramList) setStr, args := b.handleSet(typeOf, valueOf, args)
whereStr, paramList := b.handleWhere(paramList) whereStr, args := b.handleWhere(args)
sqlStr := "UPDATE " + b.getTableNameCommon(typeOf, valueOf) + setStr + whereStr sqlStr := "UPDATE " + b.getTableNameCommon(typeOf, valueOf) + setStr + whereStr
return b.ExecAffected(sqlStr, paramList...) return b.execAffected(sqlStr, args...)
} }
// Delete 删除记录 // Delete 删除记录
@@ -389,208 +310,11 @@ func (b *Builder) Delete(destList ...interface{}) (int64, error) {
tableName = getTableNameByTable(b.table) tableName = getTableNameByTable(b.table)
} }
var paramList []any var args []any
whereStr, paramList := b.handleWhere(paramList) whereStr, args := b.handleWhere(args)
sqlStr := "DELETE FROM " + tableName + whereStr sqlStr := "DELETE FROM " + tableName + whereStr
return b.ExecAffected(sqlStr, paramList...) return b.execAffected(sqlStr, args...)
}
// Truncate 清空记录
func (b *Builder) Truncate() (int64, error) {
sqlStr := ""
if b.driverName == model.Sqlite3 {
sqlStr = "DELETE FROM " + getTableNameByTable(b.table)
} else {
sqlStr = "TRUNCATE TABLE " + getTableNameByTable(b.table)
}
return b.ExecAffected(sqlStr)
}
// Exists 存在某记录
func (b *Builder) Exists() (bool, error) {
var obj IntStruct
err := b.selectCommon("", "1 AS c", nil, "").Limit(0, 1).GetOne(&obj)
if err != nil {
return false, err
}
if obj.C.Int64 == 1 {
return true, nil
} else {
return false, nil
}
}
// DoesntExist 不存在某记录
func (b *Builder) DoesntExist() (bool, error) {
isE, err := b.Exists()
return !isE, err
}
// Value 字段值
func (b *Builder) Value(field interface{}, dest interface{}) error {
b.Select(field).Limit(0, 1)
fieldName := getFieldName(field)
rows, errRows := b.GetRows()
defer rows.Close()
if errRows != nil {
return errRows
}
destValue := reflect.ValueOf(dest).Elem()
//从数据库中读出来的字段名字
columnNameList, errColumns := rows.Columns()
if errColumns != nil {
return errColumns
}
for rows.Next() {
var scans []interface{}
for _, columnName := range columnNameList {
if fieldName == columnName {
scans = append(scans, destValue.Addr().Interface())
} else {
var emptyVal interface{}
scans = append(scans, &emptyVal)
}
}
err := rows.Scan(scans...)
if err != nil {
return err
}
}
return nil
}
// Pluck 获取某一列的值
func (b *Builder) Pluck(field interface{}, values interface{}) error {
b.Select(field)
fieldName := getFieldName(field)
rows, errRows := b.GetRows()
defer rows.Close()
if errRows != nil {
return errRows
}
destSlice := reflect.Indirect(reflect.ValueOf(values))
destType := destSlice.Type().Elem()
destValue := reflect.New(destType).Elem()
//从数据库中读出来的字段名字
columnNameList, errColumns := rows.Columns()
if errColumns != nil {
return errColumns
}
for rows.Next() {
var scans []interface{}
for _, columnName := range columnNameList {
if fieldName == columnName {
scans = append(scans, destValue.Addr().Interface())
} else {
var emptyVal interface{}
scans = append(scans, &emptyVal)
}
}
err := rows.Scan(scans...)
if err != nil {
return err
}
destSlice.Set(reflect.Append(destSlice, destValue))
}
return nil
}
// Increment 某字段自增
func (b *Builder) Increment(field interface{}, step int) (int64, error) {
var paramList []any
paramList = append(paramList, step)
whereStr, paramList := b.handleWhere(paramList)
sqlStr := "UPDATE " + getTableNameByTable(b.table) + " SET " + getFieldName(field) + "=" + getFieldName(field) + "+?" + whereStr
return b.ExecAffected(sqlStr, paramList...)
}
// Decrement 某字段自减
func (b *Builder) Decrement(field interface{}, step int) (int64, error) {
var paramList []any
paramList = append(paramList, step)
whereStr, paramList := b.handleWhere(paramList)
sqlStr := "UPDATE " + getTableNameByTable(b.table) + " SET " + getFieldName(field) + "=" + getFieldName(field) + "-?" + whereStr
return b.ExecAffected(sqlStr, paramList...)
}
// Exec 通用执行-新增,更新,删除
func (b *Builder) Exec(sql string, paramList ...interface{}) (sql.Result, error) {
if b.driverName == model.Postgres {
sql = convertToPostgresSql(sql)
}
if b.isDebug {
fmt.Println(sql)
fmt.Println(paramList...)
}
smt, err1 := b.LinkCommon.Prepare(sql)
if err1 != nil {
return nil, err1
}
defer smt.Close()
res, err2 := smt.Exec(paramList...)
if err2 != nil {
return nil, err2
}
//b.clear()
return res, nil
}
// ExecAffected 通用执行-更新,删除
func (b *Builder) ExecAffected(sql string, paramList ...interface{}) (int64, error) {
if b.driverName == model.Postgres {
sql = convertToPostgresSql(sql)
}
res, err := b.Exec(sql, paramList...)
if err != nil {
return 0, err
}
count, err := res.RowsAffected()
if err != nil {
return 0, err
}
return count, nil
}
// Debug 链式操作-是否开启调试,打印sql
func (b *Builder) Debug(isDebug bool) *Builder {
b.isDebug = isDebug
return b
}
// Table 链式操作-从哪个表查询,允许直接写别名,例如 person p
func (b *Builder) Table(table interface{}, alias ...string) *Builder {
b.table = table
if len(alias) > 0 {
b.tableAlias = alias[0]
}
return b
} }
// GroupBy 链式操作,以某字段进行分组 // GroupBy 链式操作,以某字段进行分组
@@ -602,39 +326,104 @@ func (b *Builder) GroupBy(field interface{}, prefix ...string) *Builder {
return b return b
} }
// OrderBy 链式操作,以某字段进行排序
func (b *Builder) OrderBy(field interface{}, orderType string, prefix ...string) *Builder {
b.orderList = append(b.orderList, OrderItem{
Prefix: getPrefixByField(field, prefix...),
Field: field,
OrderType: orderType,
})
return b
}
// Limit 链式操作,分页 // Limit 链式操作,分页
func (b *Builder) Limit(offset int, pageSize int) *Builder { func (b *Builder) Limit(offset int, pageSize int) *Builder {
b.offset = offset b.limitItem = LimitItem{
b.pageSize = pageSize offset: offset,
pageSize: pageSize,
}
return b return b
} }
// Page 链式操作,分页 // Page 链式操作,分页
func (b *Builder) Page(pageNum int, pageSize int) *Builder { func (b *Builder) Page(pageNum int, pageSize int) *Builder {
b.offset = (pageNum - 1) * pageSize b.limitItem = LimitItem{
b.pageSize = pageSize offset: (pageNum - 1) * pageSize,
pageSize: pageSize,
}
return b return b
} }
// LockForUpdate 加锁, sqlte3不支持此操作 // LockForUpdate 加锁, sqlite3不支持此操作
func (b *Builder) LockForUpdate(isLockForUpdate bool) *Builder { func (b *Builder) LockForUpdate(isLockForUpdate bool) *Builder {
b.isLockForUpdate = isLockForUpdate b.isLockForUpdate = isLockForUpdate
return b return b
} }
// Truncate 清空记录
func (b *Builder) Truncate() (int64, error) {
sqlStr := ""
if b.driverName == model.Sqlite3 {
sqlStr = "DELETE FROM " + getTableNameByTable(b.table)
} else {
sqlStr = "TRUNCATE TABLE " + getTableNameByTable(b.table)
}
return b.execAffected(sqlStr)
}
// RawSql 执行原始的sql语句
func (b *Builder) RawSql(sql string, args ...interface{}) *Builder {
b.sql = sql
b.args = args
return b
}
// GetRows 获取行操作
func (b *Builder) GetRows() (*sql.Rows, error) {
sql, args := b.GetSqlAndParams()
if b.driverName == model.Postgres {
sql = convertToPostgresSql(sql)
}
if b.isDebug {
fmt.Println(sql)
fmt.Println(args...)
}
smt, errSmt := b.LinkCommon.Prepare(sql)
if errSmt != nil {
return nil, errSmt
}
//defer smt.Close()
rows, errRows := smt.Query(args...)
if errRows != nil {
return nil, errRows
}
return rows, nil
}
// Exec 通用执行-新增,更新,删除
func (b *Builder) Exec() (sql.Result, error) {
if b.driverName == model.Postgres {
b.sql = convertToPostgresSql(b.sql)
}
if b.isDebug {
fmt.Println(b.sql)
fmt.Println(b.args...)
}
smt, err1 := b.LinkCommon.Prepare(b.sql)
if err1 != nil {
return nil, err1
}
defer smt.Close()
res, err2 := smt.Exec(b.args...)
if err2 != nil {
return nil, err2
}
//b.clear()
return res, nil
}
//拼接SQL,查询与筛选通用操作 //拼接SQL,查询与筛选通用操作
func (b *Builder) whereAndHaving(where []WhereItem, paramList []any, isFromHaving bool) ([]string, []any) { func (b *Builder) whereAndHaving(where []WhereItem, args []any, isFromHaving bool) ([]string, []any) {
var whereList []string var whereList []string
for i := 0; i < len(where); i++ { for i := 0; i < len(where); i++ {
allFieldName := "" allFieldName := ""
@@ -655,12 +444,12 @@ func (b *Builder) whereAndHaving(where []WhereItem, paramList []any, isFromHavin
} }
if "**builder.Builder" == reflect.TypeOf(where[i].Val).String() { if "**builder.Builder" == reflect.TypeOf(where[i].Val).String() {
executor := *(**Builder)(unsafe.Pointer(reflect.ValueOf(where[i].Val).Pointer())) subBuilder := *(**Builder)(unsafe.Pointer(reflect.ValueOf(where[i].Val).Pointer()))
subSql, subParams := executor.GetSqlAndParams() subSql, subParams := subBuilder.GetSqlAndParams()
if where[i].Opt != Raw { if where[i].Opt != Raw {
whereList = append(whereList, allFieldName+" "+where[i].Opt+" "+"("+subSql+")") whereList = append(whereList, allFieldName+" "+where[i].Opt+" "+"("+subSql+")")
paramList = append(paramList, subParams...) args = append(args, subParams...)
} }
} else { } else {
if where[i].Opt == Eq || where[i].Opt == Ne || where[i].Opt == Gt || where[i].Opt == Ge || where[i].Opt == Lt || where[i].Opt == Le { if where[i].Opt == Eq || where[i].Opt == Ne || where[i].Opt == Gt || where[i].Opt == Ge || where[i].Opt == Lt || where[i].Opt == Le {
@@ -677,13 +466,13 @@ func (b *Builder) whereAndHaving(where []WhereItem, paramList []any, isFromHavin
} }
} }
paramList = append(paramList, fmt.Sprintf("%v", where[i].Val)) args = append(args, fmt.Sprintf("%v", where[i].Val))
} }
if where[i].Opt == Between || where[i].Opt == NotBetween { if where[i].Opt == Between || where[i].Opt == NotBetween {
values := toAnyArr(where[i].Val) values := toAnyArr(where[i].Val)
whereList = append(whereList, allFieldName+" "+where[i].Opt+" "+"(?) AND (?)") whereList = append(whereList, allFieldName+" "+where[i].Opt+" "+"(?) AND (?)")
paramList = append(paramList, values...) args = append(args, values...)
} }
if where[i].Opt == Like || where[i].Opt == NotLike { if where[i].Opt == Like || where[i].Opt == NotLike {
@@ -693,7 +482,7 @@ func (b *Builder) whereAndHaving(where []WhereItem, paramList []any, isFromHavin
str := fmt.Sprintf("%v", values[j]) str := fmt.Sprintf("%v", values[j])
if "%" != str { if "%" != str {
paramList = append(paramList, str) args = append(args, str)
valueStr = append(valueStr, "?") valueStr = append(valueStr, "?")
} else { } else {
valueStr = append(valueStr, "'"+str+"'") valueStr = append(valueStr, "'"+str+"'")
@@ -711,7 +500,7 @@ func (b *Builder) whereAndHaving(where []WhereItem, paramList []any, isFromHavin
} }
whereList = append(whereList, allFieldName+" "+where[i].Opt+" "+"("+strings.Join(placeholder, ",")+")") whereList = append(whereList, allFieldName+" "+where[i].Opt+" "+"("+strings.Join(placeholder, ",")+")")
paramList = append(paramList, values...) args = append(args, values...)
} }
if where[i].Opt == Raw { if where[i].Opt == Raw {
@@ -723,7 +512,7 @@ func (b *Builder) whereAndHaving(where []WhereItem, paramList []any, isFromHavin
} }
} }
} }
return whereList, paramList return whereList, args
} }
func (b *Builder) getConcatForFloat(vars ...string) string { func (b *Builder) getConcatForFloat(vars ...string) string {
@@ -743,3 +532,80 @@ func (b *Builder) getConcatForLike(vars ...string) string {
return "CONCAT(" + strings.Join(vars, ",") + ")" return "CONCAT(" + strings.Join(vars, ",") + ")"
} }
} }
func (b *Builder) getTableNameCommon(typeOf reflect.Type, valueOf reflect.Value) string {
if b.table != nil {
return getTableNameByTable(b.table)
}
return getTableNameByReflect(typeOf, valueOf)
}
func (b *Builder) GetSqlAndParams() (string, []interface{}) {
if b.sql != "" {
return b.sql, b.args
}
var args []interface{}
tableName := getTableNameByTable(b.table)
fieldStr, args := b.handleSelect(args)
whereStr, args := b.handleWhere(args)
joinStr, args := b.handleJoin(args)
groupStr, args := b.handleGroup(args)
havingStr, args := b.handleHaving(args)
orderStr, args := b.handleOrder(args)
limitStr, args := b.handleLimit(args)
lockStr := b.handleLockForUpdate()
sql := "SELECT " + fieldStr + " FROM " + tableName + " " + b.tableAlias + joinStr + whereStr + groupStr + havingStr + orderStr + limitStr + lockStr
return sql, args
}
// execAffected 通用执行-更新,删除
func (b *Builder) execAffected(sql string, args ...interface{}) (int64, error) {
if b.driverName == model.Postgres {
sql = convertToPostgresSql(sql)
}
res, err := b.RawSql(sql, args...).Exec()
if err != nil {
return 0, err
}
count, err := res.RowsAffected()
if err != nil {
return 0, err
}
return count, nil
}
func getTagMap(fieldTag string) map[string]string {
var fieldMap = make(map[string]string)
if "" != fieldTag {
tagArr := strings.Split(fieldTag, ";")
for j := 0; j < len(tagArr); j++ {
tagArrArr := strings.Split(tagArr[j], ":")
fieldMap[tagArrArr[0]] = ""
if len(tagArrArr) > 1 {
fieldMap[tagArrArr[0]] = tagArrArr[1]
}
}
}
return fieldMap
}
//对于Postgres数据库不支持?占位符,支持$1,$2类型需要做转换
func convertToPostgresSql(sqlStr string) string {
t := 1
for {
if strings.Index(sqlStr, "?") == -1 {
break
}
sqlStr = strings.Replace(sqlStr, "?", "$"+strconv.Itoa(t), 1)
t += 1
}
return sqlStr
}

23
builder/exists.go Normal file
View File

@@ -0,0 +1,23 @@
package builder
// Exists 存在某记录
func (b *Builder) Exists() (bool, error) {
var obj IntStruct
err := b.selectCommon("", "1 AS c", nil, "").Limit(0, 1).GetOne(&obj)
if err != nil {
return false, err
}
if obj.C.Int64 == 1 {
return true, nil
} else {
return false, nil
}
}
// DoesntExist 不存在某记录
func (b *Builder) DoesntExist() (bool, error) {
isE, err := b.Exists()
return !isE, err
}

View File

@@ -57,8 +57,8 @@ func (b *Builder) handleSelect(paramList []any) (string, []any) {
//处理子语句 //处理子语句
for i := 0; i < len(b.selectExpList); i++ { for i := 0; i < len(b.selectExpList); i++ {
executor := *(b.selectExpList[i].Builder) subBuilder := *(b.selectExpList[i].Builder)
subSql, subParamList := executor.GetSqlAndParams() subSql, subParamList := subBuilder.GetSqlAndParams()
strList = append(strList, "("+subSql+") AS "+getFieldName(b.selectExpList[i].FieldName)) strList = append(strList, "("+subSql+") AS "+getFieldName(b.selectExpList[i].FieldName))
paramList = append(paramList, subParamList...) paramList = append(paramList, subParamList...)
} }
@@ -82,8 +82,8 @@ func (b *Builder) handleWhere(paramList []any) (string, []any) {
func (b *Builder) handleSet(typeOf reflect.Type, valueOf reflect.Value, paramList []any) (string, []any) { func (b *Builder) handleSet(typeOf reflect.Type, valueOf reflect.Value, paramList []any) (string, []any) {
//如果没有设置表名 //如果没有设置表名
if b.tableName == "" { if b.table == nil {
b.tableName = getTableNameByReflect(typeOf, valueOf) b.table = getTableNameByReflect(typeOf, valueOf)
} }
var keys []string var keys []string
@@ -163,19 +163,19 @@ func (b *Builder) handleOrder(paramList []any) (string, []any) {
//拼接SQL,分页相关 Postgres数据库分页数量在前偏移在后其他数据库偏移量在前分页数量在后另外Mssql数据库的关键词是offset...next //拼接SQL,分页相关 Postgres数据库分页数量在前偏移在后其他数据库偏移量在前分页数量在后另外Mssql数据库的关键词是offset...next
func (b *Builder) handleLimit(paramList []any) (string, []any) { func (b *Builder) handleLimit(paramList []any) (string, []any) {
if 0 == b.pageSize { if 0 == b.limitItem.pageSize {
return "", paramList return "", paramList
} }
str := "" str := ""
if b.driverName == model.Postgres { if b.driverName == model.Postgres {
paramList = append(paramList, b.pageSize) paramList = append(paramList, b.limitItem.pageSize)
paramList = append(paramList, b.offset) paramList = append(paramList, b.limitItem.offset)
str = " Limit ? offset ? " str = " Limit ? offset ? "
} else { } else {
paramList = append(paramList, b.offset) paramList = append(paramList, b.limitItem.offset)
paramList = append(paramList, b.pageSize) paramList = append(paramList, b.limitItem.pageSize)
str = " Limit ?,? " str = " Limit ?,? "
if b.driverName == model.Mssql { if b.driverName == model.Mssql {

View File

@@ -11,8 +11,8 @@ func (b *Builder) Having(dest interface{}) *Builder {
valueOf := reflect.ValueOf(dest) valueOf := reflect.ValueOf(dest)
//如果没有设置表名 //如果没有设置表名
if b.tableName == "" { if b.table == nil {
b.tableName = getTableNameByReflect(typeOf, valueOf) b.table = getTableNameByReflect(typeOf, valueOf)
} }
for i := 0; i < typeOf.Elem().NumField(); i++ { for i := 0; i < typeOf.Elem().NumField(); i++ {

21
builder/increment.go Normal file
View File

@@ -0,0 +1,21 @@
package builder
// Increment 某字段自增
func (b *Builder) Increment(field interface{}, step int) (int64, error) {
var paramList []any
paramList = append(paramList, step)
whereStr, paramList := b.handleWhere(paramList)
sqlStr := "UPDATE " + getTableNameByTable(b.table) + " SET " + getFieldName(field) + "=" + getFieldName(field) + "+?" + whereStr
return b.execAffected(sqlStr, paramList...)
}
// Decrement 某字段自减
func (b *Builder) Decrement(field interface{}, step int) (int64, error) {
var paramList []any
paramList = append(paramList, step)
whereStr, paramList := b.handleWhere(paramList)
sqlStr := "UPDATE " + getTableNameByTable(b.table) + " SET " + getFieldName(field) + "=" + getFieldName(field) + "-?" + whereStr
return b.execAffected(sqlStr, paramList...)
}

20
builder/order.go Normal file
View File

@@ -0,0 +1,20 @@
package builder
func (b *Builder) OrderDescBy(field interface{}, prefix ...string) *Builder {
return b.OrderBy(field, Desc, prefix...)
}
func (b *Builder) OrderAscBy(field interface{}, prefix ...string) *Builder {
return b.OrderBy(field, Asc, prefix...)
}
// OrderBy 链式操作,以某字段进行排序
func (b *Builder) OrderBy(field interface{}, orderType string, prefix ...string) *Builder {
b.orderList = append(b.orderList, OrderItem{
Prefix: getPrefixByField(field, prefix...),
Field: field,
OrderType: orderType,
})
return b
}

86
builder/value.go Normal file
View File

@@ -0,0 +1,86 @@
package builder
import "reflect"
// Value 字段值
func (b *Builder) Value(field interface{}, dest interface{}) error {
b.Select(field).Limit(0, 1)
fieldName := getFieldName(field)
rows, errRows := b.GetRows()
defer rows.Close()
if errRows != nil {
return errRows
}
destValue := reflect.ValueOf(dest).Elem()
//从数据库中读出来的字段名字
columnNameList, errColumns := rows.Columns()
if errColumns != nil {
return errColumns
}
for rows.Next() {
var scans []interface{}
for _, columnName := range columnNameList {
if fieldName == columnName {
scans = append(scans, destValue.Addr().Interface())
} else {
var emptyVal interface{}
scans = append(scans, &emptyVal)
}
}
err := rows.Scan(scans...)
if err != nil {
return err
}
}
return nil
}
// Pluck 获取某一列的值
func (b *Builder) Pluck(field interface{}, values interface{}) error {
b.Select(field)
fieldName := getFieldName(field)
rows, errRows := b.GetRows()
defer rows.Close()
if errRows != nil {
return errRows
}
destSlice := reflect.Indirect(reflect.ValueOf(values))
destType := destSlice.Type().Elem()
destValue := reflect.New(destType).Elem()
//从数据库中读出来的字段名字
columnNameList, errColumns := rows.Columns()
if errColumns != nil {
return errColumns
}
for rows.Next() {
var scans []interface{}
for _, columnName := range columnNameList {
if fieldName == columnName {
scans = append(scans, destValue.Addr().Interface())
} else {
var emptyVal interface{}
scans = append(scans, &emptyVal)
}
}
err := rows.Scan(scans...)
if err != nil {
return err
}
destSlice.Set(reflect.Append(destSlice, destValue))
}
return nil
}

View File

@@ -11,8 +11,8 @@ func (b *Builder) Where(dest interface{}) *Builder {
valueOf := reflect.ValueOf(dest) valueOf := reflect.ValueOf(dest)
//如果没有设置表名 //如果没有设置表名
if b.tableName == "" { if b.table == nil {
b.tableName = getTableNameByReflect(typeOf, valueOf) b.table = getTableNameByReflect(typeOf, valueOf)
} }
for i := 0; i < typeOf.Elem().NumField(); i++ { for i := 0; i < typeOf.Elem().NumField(); i++ {

View File

@@ -220,7 +220,7 @@ func (mm *MigrateExecutor) modifyTable(tableFromCode Table, columnsFromCode []Co
sql := "ALTER TABLE " + tableFromCode.TableName.String + " MODIFY " + getColumnStr(columnCode) sql := "ALTER TABLE " + tableFromCode.TableName.String + " MODIFY " + getColumnStr(columnCode)
fmt.Println(sql) fmt.Println(sql)
_, err := mm.Ex.Exec(sql) _, err := mm.Ex.RawSql(sql).Exec()
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
} else { } else {
@@ -232,7 +232,7 @@ func (mm *MigrateExecutor) modifyTable(tableFromCode Table, columnsFromCode []Co
if isFind == 0 { if isFind == 0 {
sql := "ALTER TABLE " + tableFromCode.TableName.String + " ADD " + getColumnStr(columnCode) sql := "ALTER TABLE " + tableFromCode.TableName.String + " ADD " + getColumnStr(columnCode)
_, err := mm.Ex.Exec(sql) _, err := mm.Ex.RawSql(sql).Exec()
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
} else { } else {
@@ -261,7 +261,7 @@ func (mm *MigrateExecutor) modifyTable(tableFromCode Table, columnsFromCode []Co
if !keyMatch || indexCode.NonUnique.Int64 != indexDb.NonUnique.Int64 { if !keyMatch || indexCode.NonUnique.Int64 != indexDb.NonUnique.Int64 {
sql := "ALTER TABLE " + tableFromCode.TableName.String + " MODIFY " + getIndexStr(indexCode) sql := "ALTER TABLE " + tableFromCode.TableName.String + " MODIFY " + getIndexStr(indexCode)
_, err := mm.Ex.Exec(sql) _, err := mm.Ex.RawSql(sql).Exec()
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
} else { } else {
@@ -273,7 +273,7 @@ func (mm *MigrateExecutor) modifyTable(tableFromCode Table, columnsFromCode []Co
if isFind == 0 { if isFind == 0 {
sql := "ALTER TABLE " + tableFromCode.TableName.String + " ADD " + getIndexStr(indexCode) sql := "ALTER TABLE " + tableFromCode.TableName.String + " ADD " + getIndexStr(indexCode)
_, err := mm.Ex.Exec(sql) _, err := mm.Ex.RawSql(sql).Exec()
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
} else { } else {
@@ -297,9 +297,8 @@ func (mm *MigrateExecutor) createTable(tableFromCode Table, columnsFromCode []Co
} }
sqlStr := "CREATE TABLE " + tableFromCode.TableName.String + " (\n" + strings.Join(fieldArr, ",\n") + "\n) " + ";" sqlStr := "CREATE TABLE " + tableFromCode.TableName.String + " (\n" + strings.Join(fieldArr, ",\n") + "\n) " + ";"
fmt.Println(sqlStr)
_, err := mm.Ex.Exec(sqlStr) _, err := mm.Ex.RawSql(sqlStr).Exec()
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
} else { } else {

View File

@@ -232,7 +232,7 @@ func (mm *MigrateExecutor) modifyTable(tableFromCode Table, columnsFromCode []Co
columnCode.Extra.String != columnDb.Extra.String || columnCode.Extra.String != columnDb.Extra.String ||
columnCode.ColumnDefault.String != columnDb.ColumnDefault.String { columnCode.ColumnDefault.String != columnDb.ColumnDefault.String {
sql := "ALTER TABLE " + tableFromCode.TableName.String + " MODIFY " + getColumnStr(columnCode) sql := "ALTER TABLE " + tableFromCode.TableName.String + " MODIFY " + getColumnStr(columnCode)
_, err := mm.Ex.Exec(sql) _, err := mm.Ex.RawSql(sql).Exec()
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
} else { } else {
@@ -244,7 +244,7 @@ func (mm *MigrateExecutor) modifyTable(tableFromCode Table, columnsFromCode []Co
if isFind == 0 { if isFind == 0 {
sql := "ALTER TABLE " + tableFromCode.TableName.String + " ADD " + getColumnStr(columnCode) sql := "ALTER TABLE " + tableFromCode.TableName.String + " ADD " + getColumnStr(columnCode)
_, err := mm.Ex.Exec(sql) _, err := mm.Ex.RawSql(sql).Exec()
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
} else { } else {
@@ -263,7 +263,7 @@ func (mm *MigrateExecutor) modifyTable(tableFromCode Table, columnsFromCode []Co
isFind = 1 isFind = 1
if indexCode.KeyName != indexDb.KeyName || indexCode.NonUnique != indexDb.NonUnique { if indexCode.KeyName != indexDb.KeyName || indexCode.NonUnique != indexDb.NonUnique {
sql := "ALTER TABLE " + tableFromCode.TableName.String + " MODIFY " + getIndexStr(indexCode) sql := "ALTER TABLE " + tableFromCode.TableName.String + " MODIFY " + getIndexStr(indexCode)
_, err := mm.Ex.Exec(sql) _, err := mm.Ex.RawSql(sql).Exec()
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
} else { } else {
@@ -275,7 +275,7 @@ func (mm *MigrateExecutor) modifyTable(tableFromCode Table, columnsFromCode []Co
if isFind == 0 { if isFind == 0 {
sql := "ALTER TABLE " + tableFromCode.TableName.String + " ADD " + getIndexStr(indexCode) sql := "ALTER TABLE " + tableFromCode.TableName.String + " ADD " + getIndexStr(indexCode)
_, err := mm.Ex.Exec(sql) _, err := mm.Ex.RawSql(sql).Exec()
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
} else { } else {
@@ -287,7 +287,7 @@ func (mm *MigrateExecutor) modifyTable(tableFromCode Table, columnsFromCode []Co
func (mm *MigrateExecutor) modifyTableEngine(tableFromCode Table) { func (mm *MigrateExecutor) modifyTableEngine(tableFromCode Table) {
sql := "ALTER TABLE " + tableFromCode.TableName.String + " Engine " + tableFromCode.Engine.String sql := "ALTER TABLE " + tableFromCode.TableName.String + " Engine " + tableFromCode.Engine.String
_, err := mm.Ex.Exec(sql) _, err := mm.Ex.RawSql(sql).Exec()
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
} else { } else {
@@ -297,7 +297,7 @@ func (mm *MigrateExecutor) modifyTableEngine(tableFromCode Table) {
func (mm *MigrateExecutor) modifyTableComment(tableFromCode Table) { func (mm *MigrateExecutor) modifyTableComment(tableFromCode Table) {
sql := "ALTER TABLE " + tableFromCode.TableName.String + " Comment " + tableFromCode.TableComment.String sql := "ALTER TABLE " + tableFromCode.TableName.String + " Comment " + tableFromCode.TableComment.String
_, err := mm.Ex.Exec(sql) _, err := mm.Ex.RawSql(sql).Exec()
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
} else { } else {
@@ -318,8 +318,8 @@ func (mm *MigrateExecutor) createTable(tableFromCode Table, columnsFromCode []Co
fieldArr = append(fieldArr, getIndexStr(index)) fieldArr = append(fieldArr, getIndexStr(index))
} }
sqlStr := "CREATE TABLE `" + tableFromCode.TableName.String + "` (\n" + strings.Join(fieldArr, ",\n") + "\n) " + " ENGINE " + tableFromCode.Engine.String + " COMMENT " + tableFromCode.TableComment.String + ";" sql := "CREATE TABLE `" + tableFromCode.TableName.String + "` (\n" + strings.Join(fieldArr, ",\n") + "\n) " + " ENGINE " + tableFromCode.Engine.String + " COMMENT " + tableFromCode.TableComment.String + ";"
_, err := mm.Ex.Exec(sqlStr) _, err := mm.Ex.RawSql(sql).Exec()
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
} else { } else {

View File

@@ -252,7 +252,7 @@ func (mm *MigrateExecutor) modifyTable(tableFromCode Table, columnsFromCode []Co
sql := "ALTER TABLE " + tableFromCode.TableName.String + " alter COLUMN " + getColumnStr(columnCode, "type") sql := "ALTER TABLE " + tableFromCode.TableName.String + " alter COLUMN " + getColumnStr(columnCode, "type")
//fmt.Println(sql) //fmt.Println(sql)
_, err := mm.Ex.Exec(sql) _, err := mm.Ex.RawSql(sql).Exec()
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
} else { } else {
@@ -264,7 +264,7 @@ func (mm *MigrateExecutor) modifyTable(tableFromCode Table, columnsFromCode []Co
if isFind == 0 { if isFind == 0 {
sql := "ALTER TABLE " + tableFromCode.TableName.String + " ADD " + getColumnStr(columnCode, "") sql := "ALTER TABLE " + tableFromCode.TableName.String + " ADD " + getColumnStr(columnCode, "")
_, err := mm.Ex.Exec(sql) _, err := mm.Ex.RawSql(sql).Exec()
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
} else { } else {
@@ -283,7 +283,7 @@ func (mm *MigrateExecutor) modifyTable(tableFromCode Table, columnsFromCode []Co
isFind = 1 isFind = 1
if indexCode.KeyName != indexDb.KeyName || indexCode.NonUnique != indexDb.NonUnique { if indexCode.KeyName != indexDb.KeyName || indexCode.NonUnique != indexDb.NonUnique {
sql := "ALTER TABLE " + tableFromCode.TableName.String + " MODIFY " + getIndexStr(indexCode) sql := "ALTER TABLE " + tableFromCode.TableName.String + " MODIFY " + getIndexStr(indexCode)
_, err := mm.Ex.Exec(sql) _, err := mm.Ex.RawSql(sql).Exec()
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
} else { } else {
@@ -301,7 +301,7 @@ func (mm *MigrateExecutor) modifyTable(tableFromCode Table, columnsFromCode []Co
func (mm *MigrateExecutor) modifyTableComment(tableFromCode Table) { func (mm *MigrateExecutor) modifyTableComment(tableFromCode Table) {
sql := "ALTER TABLE " + tableFromCode.TableName.String + " Comment " + tableFromCode.TableComment.String sql := "ALTER TABLE " + tableFromCode.TableName.String + " Comment " + tableFromCode.TableComment.String
_, err := mm.Ex.Exec(sql) _, err := mm.Ex.RawSql(sql).Exec()
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
} else { } else {
@@ -324,10 +324,9 @@ func (mm *MigrateExecutor) createTable(tableFromCode Table, columnsFromCode []Co
} }
} }
sqlStr := "CREATE TABLE " + tableFromCode.TableName.String + " (\n" + strings.Join(fieldArr, ",\n") + "\n) " + ";" sql := "CREATE TABLE " + tableFromCode.TableName.String + " (\n" + strings.Join(fieldArr, ",\n") + "\n) " + ";"
fmt.Println(sqlStr)
_, err := mm.Ex.Exec(sqlStr) _, err := mm.Ex.RawSql(sql).Exec()
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
} else { } else {
@@ -350,7 +349,7 @@ func (mm *MigrateExecutor) createIndex(tableName string, index Index) {
} }
sql := "CREATE " + keyType + " INDEX " + index.KeyName.String + " on " + tableName + " (" + index.ColumnName.String + ")" sql := "CREATE " + keyType + " INDEX " + index.KeyName.String + " on " + tableName + " (" + index.ColumnName.String + ")"
_, err := mm.Ex.Exec(sql) _, err := mm.Ex.RawSql(sql).Exec()
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
} else { } else {

View File

@@ -258,7 +258,7 @@ func (mm *MigrateExecutor) modifyTable(tableFromCode Table, columnsFromCode []Co
columnCode.ColumnDefault.String != columnDb.ColumnDefault.String { columnCode.ColumnDefault.String != columnDb.ColumnDefault.String {
sql := "ALTER TABLE " + tableFromCode.TableName.String + " MODIFY " + getColumnStr(columnCode) sql := "ALTER TABLE " + tableFromCode.TableName.String + " MODIFY " + getColumnStr(columnCode)
_, err := mm.Ex.Exec(sql) _, err := mm.Ex.RawSql(sql).Exec()
if err != nil { if err != nil {
fmt.Println(sql) fmt.Println(sql)
fmt.Println(err) fmt.Println(err)
@@ -271,7 +271,7 @@ func (mm *MigrateExecutor) modifyTable(tableFromCode Table, columnsFromCode []Co
if isFind == 0 { if isFind == 0 {
sql := "ALTER TABLE " + tableFromCode.TableName.String + " ADD " + getColumnStr(columnCode) sql := "ALTER TABLE " + tableFromCode.TableName.String + " ADD " + getColumnStr(columnCode)
_, err := mm.Ex.Exec(sql) _, err := mm.Ex.RawSql(sql).Exec()
if err != nil { if err != nil {
fmt.Println(sql) fmt.Println(sql)
fmt.Println(err) fmt.Println(err)
@@ -291,7 +291,7 @@ func (mm *MigrateExecutor) modifyTable(tableFromCode Table, columnsFromCode []Co
isFind = 1 isFind = 1
if indexCode.KeyName != indexDb.KeyName || indexCode.NonUnique != indexDb.NonUnique { if indexCode.KeyName != indexDb.KeyName || indexCode.NonUnique != indexDb.NonUnique {
sql := "ALTER TABLE " + tableFromCode.TableName.String + " MODIFY " + getIndexStr(indexCode) sql := "ALTER TABLE " + tableFromCode.TableName.String + " MODIFY " + getIndexStr(indexCode)
_, err := mm.Ex.Exec(sql) _, err := mm.Ex.RawSql(sql).Exec()
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
} else { } else {
@@ -323,8 +323,8 @@ func (mm *MigrateExecutor) createTable(tableFromCode Table, columnsFromCode []Co
} }
//创建表结构与主键索引 //创建表结构与主键索引
sqlStr := "CREATE TABLE `" + tableFromCode.TableName.String + "` (\n" + strings.Join(fieldArr, ",\n") + "\n) " + ";" sql := "CREATE TABLE `" + tableFromCode.TableName.String + "` (\n" + strings.Join(fieldArr, ",\n") + "\n) " + ";"
_, err := mm.Ex.Exec(sqlStr) _, err := mm.Ex.RawSql(sql).Exec()
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
} else { } else {
@@ -347,7 +347,7 @@ func (mm *MigrateExecutor) createIndex(tableName string, index Index) {
} }
sql := "CREATE " + keyType + " INDEX " + index.KeyName.String + " on " + tableName + " (" + index.ColumnName.String + ")" sql := "CREATE " + keyType + " INDEX " + index.KeyName.String + " on " + tableName + " (" + index.ColumnName.String + ")"
_, err := mm.Ex.Exec(sql) _, err := mm.Ex.RawSql(sql).Exec()
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
} else { } else {

View File

@@ -156,7 +156,7 @@ func TestAll(t *testing.T) {
testDistinct(dbItem.DriverName, dbItem.DbLink) testDistinct(dbItem.DriverName, dbItem.DbLink)
testExec(dbItem.DriverName, dbItem.DbLink) testRawSql(dbItem.DriverName, dbItem.DbLink, id2)
testTransaction(dbItem.DriverName, dbItem.DbLink) testTransaction(dbItem.DriverName, dbItem.DbLink)
testTruncate(dbItem.DriverName, dbItem.DbLink) testTruncate(dbItem.DriverName, dbItem.DbLink)
@@ -556,6 +556,7 @@ func testLock(driver string, db *sql.DB, id int64) {
if driver == model.Sqlite3 || driver == model.Mssql { if driver == model.Sqlite3 || driver == model.Mssql {
return return
} }
var itemByLock Person var itemByLock Person
err := aorm.Db(db). err := aorm.Db(db).
Debug(false). Debug(false).
@@ -680,10 +681,16 @@ func testDistinct(driver string, db *sql.DB) {
} }
} }
func testExec(driver string, db *sql.DB) { func testRawSql(driver string, db *sql.DB, id2 int64) {
_, err := aorm.Db(db).Debug(false).Driver(driver).Exec("UPDATE person SET name = ? WHERE person.id=?", "Bob", 3) var list []Person
err1 := aorm.Db(db).Debug(false).Driver(driver).RawSql("SELECT * FROM person WHERE id=? AND type=?", id2, 0).GetMany(&list)
if err1 != nil {
panic(err1)
}
_, err := aorm.Db(db).Debug(false).Driver(driver).RawSql("UPDATE person SET name = ? WHERE id=?", "Bob2", id2).Exec()
if err != nil { if err != nil {
panic(driver + "testExec" + "found err") panic(driver + "testRawSql" + "found err")
} }
} }