some thing wrong?

This commit is contained in:
tangpanqing
2022-12-21 21:47:01 +08:00
parent 5309a27846
commit e925a95912
7 changed files with 1396 additions and 892 deletions

97
aorm.go
View File

@@ -2,77 +2,64 @@ package aorm
import ( import (
"database/sql" //只需导入你需要的驱动即可 "database/sql" //只需导入你需要的驱动即可
"github.com/tangpanqing/aorm/executor"
) )
// LinkCommon database/sql提供的库连接与事务二者有很多方法是一致的为了通用抽象为该interface // DbContent 数据库连接与数据库类型
type LinkCommon interface { type DbContent struct {
Exec(query string, args ...interface{}) (sql.Result, error) DriverName string
Prepare(query string) (*sql.Stmt, error) DbLink *sql.DB
Query(query string, args ...interface{}) (*sql.Rows, error)
QueryRow(query string, args ...interface{}) *sql.Row
} }
// Executor 查询记录所需要的条件 func Open(driverName string, dataSourceName string) (DbContent, error) {
type Executor struct { db, err := sql.Open(driverName, dataSourceName)
//数据库操作连接 if err != nil {
linkCommon LinkCommon return DbContent{}, err
//查询参数
tableName string
selectList []string
selectExpList []*ExpItem
groupList []string
whereList []WhereItem
joinList []string
havingList []WhereItem
orderList []string
offset int
pageSize int
isDebug bool
isLockForUpdate bool
//sql与参数
sql string
paramList []interface{}
//表属性
opinionList []OpinionItem
} }
type ExpItem struct { return DbContent{
Executor **Executor DriverName: driverName,
FieldName string DbLink: db,
}, nil
} }
// Use 使用数据库连接,或者事务 // Use 使用数据库连接,或者事务
func Use(linkCommon LinkCommon) *Executor { func Use(linkCommon executor.LinkCommon) *executor.Executor {
executor := &Executor{ executor := &executor.Executor{
linkCommon: linkCommon, LinkCommon: linkCommon,
}
return executor
}
func UseNew(dbContent DbContent) *executor.Executor {
executor := &executor.Executor{
LinkCommon: dbContent.DbLink,
} }
return executor return executor
} }
// Sub 子查询 // Sub 子查询
func Sub() *Executor { func Sub() *executor.Executor {
executor := &Executor{} executor := &executor.Executor{}
return executor return executor
} }
//清空查询条件,复用对象 //清空查询条件,复用对象
func (db *Executor) clear() { //func (ex *executor.Executor) clear() {
db.tableName = "" // ex.tableName = ""
db.selectList = make([]string, 0) // ex.selectList = make([]string, 0)
db.groupList = make([]string, 0) // ex.groupList = make([]string, 0)
db.whereList = make([]WhereItem, 0) // ex.whereList = make([]executor.WhereItem, 0)
db.joinList = make([]string, 0) // ex.joinList = make([]string, 0)
db.havingList = make([]WhereItem, 0) // ex.havingList = make([]executor.WhereItem, 0)
db.orderList = make([]string, 0) // ex.orderList = make([]string, 0)
db.offset = 0 // ex.offset = 0
db.pageSize = 0 // ex.pageSize = 0
db.isDebug = false // ex.isDebug = false
db.isLockForUpdate = false // ex.isLockForUpdate = false
db.sql = "" // ex.sql = ""
db.paramList = make([]interface{}, 0) // ex.paramList = make([]interface{}, 0)
db.opinionList = make([]OpinionItem, 0) // ex.opinionList = make([]OpinionItem, 0)
} //}

View File

@@ -1,9 +1,11 @@
package aorm package executor
import ( import (
"database/sql" "database/sql"
"errors" "errors"
"fmt" "fmt"
"github.com/tangpanqing/aorm"
"github.com/tangpanqing/aorm/null"
"reflect" "reflect"
"strings" "strings"
"unsafe" "unsafe"
@@ -35,21 +37,21 @@ type WhereItem struct {
} }
type IntStruct struct { type IntStruct struct {
C Int C null.Int
} }
type FloatStruct struct { type FloatStruct struct {
C Float C null.Float
} }
// Insert 增加记录 // Insert 增加记录
func (db *Executor) Insert(dest interface{}) (int64, error) { func (ex *Executor) Insert(dest interface{}) (int64, error) {
typeOf := reflect.TypeOf(dest) typeOf := reflect.TypeOf(dest)
valueOf := reflect.ValueOf(dest) valueOf := reflect.ValueOf(dest)
//如果没有设置表名 //如果没有设置表名
if db.tableName == "" { if ex.tableName == "" {
db.tableName = reflectTableName(typeOf, valueOf) ex.tableName = reflectTableName(typeOf, valueOf)
} }
var keys []string var keys []string
@@ -58,7 +60,7 @@ func (db *Executor) Insert(dest interface{}) (int64, error) {
for i := 0; i < typeOf.Elem().NumField(); i++ { for i := 0; i < typeOf.Elem().NumField(); i++ {
isNotNull := valueOf.Elem().Field(i).Field(0).Field(1).Bool() isNotNull := valueOf.Elem().Field(i).Field(0).Field(1).Bool()
if isNotNull { if isNotNull {
key := UnderLine(typeOf.Elem().Field(i).Name) key := aorm.UnderLine(typeOf.Elem().Field(i).Name)
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) paramList = append(paramList, val)
@@ -66,9 +68,9 @@ func (db *Executor) Insert(dest interface{}) (int64, error) {
} }
} }
sqlStr := "INSERT INTO " + db.tableName + " (" + strings.Join(keys, ",") + ") VALUES (" + strings.Join(place, ",") + ")" sqlStr := "INSERT INTO " + ex.tableName + " (" + strings.Join(keys, ",") + ") VALUES (" + strings.Join(place, ",") + ")"
res, err := db.Exec(sqlStr, paramList...) res, err := ex.Exec(sqlStr, paramList...)
if err != nil { if err != nil {
return 0, err return 0, err
} }
@@ -82,7 +84,7 @@ func (db *Executor) Insert(dest interface{}) (int64, error) {
} }
// InsertBatch 批量增加记录 // InsertBatch 批量增加记录
func (db *Executor) InsertBatch(values interface{}) (int64, error) { func (ex *Executor) InsertBatch(values interface{}) (int64, error) {
var keys []string var keys []string
var paramList []any var paramList []any
@@ -95,8 +97,8 @@ func (db *Executor) InsertBatch(values interface{}) (int64, error) {
typeOf := reflect.TypeOf(values).Elem().Elem() typeOf := reflect.TypeOf(values).Elem().Elem()
//如果没有设置表名 //如果没有设置表名
if db.tableName == "" { if ex.tableName == "" {
db.tableName = reflectTableName(typeOf, valueOf.Index(0)) ex.tableName = reflectTableName(typeOf, valueOf.Index(0))
} }
for j := 0; j < valueOf.Len(); j++ { for j := 0; j < valueOf.Len(); j++ {
@@ -106,7 +108,7 @@ func (db *Executor) InsertBatch(values interface{}) (int64, error) {
isNotNull := valueOf.Index(j).Field(i).Field(0).Field(1).Bool() isNotNull := valueOf.Index(j).Field(i).Field(0).Field(1).Bool()
if isNotNull { if isNotNull {
if j == 0 { if j == 0 {
key := UnderLine(typeOf.Field(i).Name) key := aorm.UnderLine(typeOf.Field(i).Name)
keys = append(keys, key) keys = append(keys, key)
} }
@@ -119,9 +121,9 @@ func (db *Executor) InsertBatch(values interface{}) (int64, error) {
place = append(place, "("+strings.Join(placeItem, ",")+")") place = append(place, "("+strings.Join(placeItem, ",")+")")
} }
sqlStr := "INSERT INTO " + db.tableName + " (" + strings.Join(keys, ",") + ") VALUES " + strings.Join(place, ",") sqlStr := "INSERT INTO " + ex.tableName + " (" + strings.Join(keys, ",") + ") VALUES " + strings.Join(place, ",")
res, err := db.Exec(sqlStr, paramList...) res, err := ex.Exec(sqlStr, paramList...)
if err != nil { if err != nil {
return 0, err return 0, err
} }
@@ -135,10 +137,10 @@ func (db *Executor) InsertBatch(values interface{}) (int64, error) {
} }
// GetRows 获取行操作 // GetRows 获取行操作
func (db *Executor) GetRows() (*sql.Rows, error) { func (ex *Executor) GetRows() (*sql.Rows, error) {
sqlStr, paramList := db.GetSqlAndParams() sqlStr, paramList := ex.GetSqlAndParams()
smt, errSmt := db.linkCommon.Prepare(sqlStr) smt, errSmt := ex.LinkCommon.Prepare(sqlStr)
if errSmt != nil { if errSmt != nil {
return nil, errSmt return nil, errSmt
} }
@@ -153,8 +155,8 @@ func (db *Executor) GetRows() (*sql.Rows, error) {
} }
// GetMany 查询记录(新) // GetMany 查询记录(新)
func (db *Executor) GetMany(values interface{}) error { func (ex *Executor) GetMany(values interface{}) error {
rows, errRows := db.GetRows() rows, errRows := ex.GetRows()
defer rows.Close() defer rows.Close()
if errRows != nil { if errRows != nil {
return errRows return errRows
@@ -188,10 +190,10 @@ func (db *Executor) GetMany(values interface{}) error {
} }
// GetOne 查询某一条记录 // GetOne 查询某一条记录
func (db *Executor) GetOne(obj interface{}) error { func (ex *Executor) GetOne(obj interface{}) error {
db.Limit(0, 1) ex.Limit(0, 1)
rows, errRows := db.GetRows() rows, errRows := ex.GetRows()
defer rows.Close() defer rows.Close()
if errRows != nil { if errRows != nil {
return errRows return errRows
@@ -221,31 +223,31 @@ func (db *Executor) GetOne(obj interface{}) error {
} }
// RawSql 执行原始的sql语句 // RawSql 执行原始的sql语句
func (db *Executor) RawSql(sql string, paramList ...interface{}) *Executor { func (ex *Executor) RawSql(sql string, paramList ...interface{}) *Executor {
db.sql = sql ex.sql = sql
db.paramList = paramList ex.paramList = paramList
return db return ex
} }
func (db *Executor) GetSqlAndParams() (string, []interface{}) { func (ex *Executor) GetSqlAndParams() (string, []interface{}) {
if db.sql != "" { if ex.sql != "" {
return db.sql, db.paramList return ex.sql, ex.paramList
} }
var paramList []interface{} var paramList []interface{}
fieldStr, paramList := handleField(db.selectList, db.selectExpList, paramList) fieldStr, paramList := handleField(ex.selectList, ex.selectExpList, paramList)
whereStr, paramList := handleWhere(db.whereList, paramList) whereStr, paramList := handleWhere(ex.whereList, paramList)
joinStr := handleJoin(db.joinList) joinStr := handleJoin(ex.joinList)
groupStr := handleGroup(db.groupList) groupStr := handleGroup(ex.groupList)
havingStr, paramList := handleHaving(db.havingList, paramList) havingStr, paramList := handleHaving(ex.havingList, paramList)
orderStr := handleOrder(db.orderList) orderStr := handleOrder(ex.orderList)
limitStr, paramList := handleLimit(db.offset, db.pageSize, paramList) limitStr, paramList := handleLimit(ex.offset, ex.pageSize, paramList)
lockStr := handleLockForUpdate(db.isLockForUpdate) lockStr := handleLockForUpdate(ex.isLockForUpdate)
sqlStr := "SELECT " + fieldStr + " FROM " + db.tableName + joinStr + whereStr + groupStr + havingStr + orderStr + limitStr + lockStr sqlStr := "SELECT " + fieldStr + " FROM " + ex.tableName + joinStr + whereStr + groupStr + havingStr + orderStr + limitStr + lockStr
if db.isDebug { if ex.isDebug {
fmt.Println(sqlStr) fmt.Println(sqlStr)
fmt.Println(paramList...) fmt.Println(paramList...)
} }
@@ -254,35 +256,35 @@ func (db *Executor) GetSqlAndParams() (string, []interface{}) {
} }
// Update 更新记录 // Update 更新记录
func (db *Executor) Update(dest interface{}) (int64, error) { func (ex *Executor) Update(dest interface{}) (int64, error) {
var paramList []any var paramList []any
setStr, paramList := db.handleSet(dest, paramList) setStr, paramList := ex.handleSet(dest, paramList)
whereStr, paramList := handleWhere(db.whereList, paramList) whereStr, paramList := handleWhere(ex.whereList, paramList)
sqlStr := "UPDATE " + db.tableName + setStr + whereStr sqlStr := "UPDATE " + ex.tableName + setStr + whereStr
return db.ExecAffected(sqlStr, paramList...) return ex.ExecAffected(sqlStr, paramList...)
} }
// Delete 删除记录 // Delete 删除记录
func (db *Executor) Delete() (int64, error) { func (ex *Executor) Delete() (int64, error) {
var paramList []any var paramList []any
whereStr, paramList := handleWhere(db.whereList, paramList) whereStr, paramList := handleWhere(ex.whereList, paramList)
sqlStr := "DELETE FROM " + db.tableName + whereStr sqlStr := "DELETE FROM " + ex.tableName + whereStr
return db.ExecAffected(sqlStr, paramList...) return ex.ExecAffected(sqlStr, paramList...)
} }
// Truncate 清空记录 // Truncate 清空记录
func (db *Executor) Truncate() (int64, error) { func (ex *Executor) Truncate() (int64, error) {
sqlStr := "TRUNCATE TABLE " + db.tableName sqlStr := "TRUNCATE TABLE " + ex.tableName
return db.ExecAffected(sqlStr) return ex.ExecAffected(sqlStr)
} }
// Count 聚合函数-数量 // Count 聚合函数-数量
func (db *Executor) Count(fieldName string) (int64, error) { func (ex *Executor) Count(fieldName string) (int64, error) {
var obj []IntStruct var obj []IntStruct
err := db.Select("count(" + fieldName + ") as c").GetMany(&obj) err := ex.Select("count(" + fieldName + ") as c").GetMany(&obj)
if err != nil { if err != nil {
return 0, err return 0, err
} }
@@ -291,9 +293,9 @@ func (db *Executor) Count(fieldName string) (int64, error) {
} }
// Sum 聚合函数-合计 // Sum 聚合函数-合计
func (db *Executor) Sum(fieldName string) (float64, error) { func (ex *Executor) Sum(fieldName string) (float64, error) {
var obj []FloatStruct var obj []FloatStruct
err := db.Select("sum(" + fieldName + ") as c").GetMany(&obj) err := ex.Select("sum(" + fieldName + ") as c").GetMany(&obj)
if err != nil { if err != nil {
return 0, err return 0, err
} }
@@ -302,9 +304,9 @@ func (db *Executor) Sum(fieldName string) (float64, error) {
} }
// Avg 聚合函数-平均值 // Avg 聚合函数-平均值
func (db *Executor) Avg(fieldName string) (float64, error) { func (ex *Executor) Avg(fieldName string) (float64, error) {
var obj []FloatStruct var obj []FloatStruct
err := db.Select("avg(" + fieldName + ") as c").GetMany(&obj) err := ex.Select("avg(" + fieldName + ") as c").GetMany(&obj)
if err != nil { if err != nil {
return 0, err return 0, err
} }
@@ -313,9 +315,9 @@ func (db *Executor) Avg(fieldName string) (float64, error) {
} }
// Max 聚合函数-最大值 // Max 聚合函数-最大值
func (db *Executor) Max(fieldName string) (float64, error) { func (ex *Executor) Max(fieldName string) (float64, error) {
var obj []FloatStruct var obj []FloatStruct
err := db.Select("max(" + fieldName + ") as c").GetMany(&obj) err := ex.Select("max(" + fieldName + ") as c").GetMany(&obj)
if err != nil { if err != nil {
return 0, err return 0, err
} }
@@ -324,9 +326,9 @@ func (db *Executor) Max(fieldName string) (float64, error) {
} }
// Min 聚合函数-最小值 // Min 聚合函数-最小值
func (db *Executor) Min(fieldName string) (float64, error) { func (ex *Executor) Min(fieldName string) (float64, error) {
var obj []FloatStruct var obj []FloatStruct
err := db.Select("min(" + fieldName + ") as c").GetMany(&obj) err := ex.Select("min(" + fieldName + ") as c").GetMany(&obj)
if err != nil { if err != nil {
return 0, err return 0, err
} }
@@ -335,10 +337,10 @@ func (db *Executor) Min(fieldName string) (float64, error) {
} }
// Value 字段值 // Value 字段值
func (db *Executor) Value(fieldName string, dest interface{}) error { func (ex *Executor) Value(fieldName string, dest interface{}) error {
db.Select(fieldName).Limit(0, 1) ex.Select(fieldName).Limit(0, 1)
rows, errRows := db.GetRows() rows, errRows := ex.GetRows()
defer rows.Close() defer rows.Close()
if errRows != nil { if errRows != nil {
return errRows return errRows
@@ -373,10 +375,10 @@ func (db *Executor) Value(fieldName string, dest interface{}) error {
} }
// Pluck 获取某一列的值 // Pluck 获取某一列的值
func (db *Executor) Pluck(fieldName string, values interface{}) error { func (ex *Executor) Pluck(fieldName string, values interface{}) error {
db.Select(fieldName) ex.Select(fieldName)
rows, errRows := db.GetRows() rows, errRows := ex.GetRows()
defer rows.Close() defer rows.Close()
if errRows != nil { if errRows != nil {
return errRows return errRows
@@ -415,33 +417,33 @@ func (db *Executor) Pluck(fieldName string, values interface{}) error {
} }
// Increment 某字段自增 // Increment 某字段自增
func (db *Executor) Increment(fieldName string, step int) (int64, error) { func (ex *Executor) Increment(fieldName string, step int) (int64, error) {
var paramList []any var paramList []any
paramList = append(paramList, step) paramList = append(paramList, step)
whereStr, paramList := handleWhere(db.whereList, paramList) whereStr, paramList := handleWhere(ex.whereList, paramList)
sqlStr := "UPDATE " + db.tableName + " SET " + fieldName + "=" + fieldName + "+?" + whereStr sqlStr := "UPDATE " + ex.tableName + " SET " + fieldName + "=" + fieldName + "+?" + whereStr
return db.ExecAffected(sqlStr, paramList...) return ex.ExecAffected(sqlStr, paramList...)
} }
// Decrement 某字段自减 // Decrement 某字段自减
func (db *Executor) Decrement(fieldName string, step int) (int64, error) { func (ex *Executor) Decrement(fieldName string, step int) (int64, error) {
var paramList []any var paramList []any
paramList = append(paramList, step) paramList = append(paramList, step)
whereStr, paramList := handleWhere(db.whereList, paramList) whereStr, paramList := handleWhere(ex.whereList, paramList)
sqlStr := "UPDATE " + db.tableName + " SET " + fieldName + "=" + fieldName + "-?" + whereStr sqlStr := "UPDATE " + ex.tableName + " SET " + fieldName + "=" + fieldName + "-?" + whereStr
return db.ExecAffected(sqlStr, paramList...) return ex.ExecAffected(sqlStr, paramList...)
} }
// Exec 通用执行-新增,更新,删除 // Exec 通用执行-新增,更新,删除
func (db *Executor) Exec(sqlStr string, args ...interface{}) (sql.Result, error) { func (ex *Executor) Exec(sqlStr string, args ...interface{}) (sql.Result, error) {
if db.isDebug { if ex.isDebug {
fmt.Println(sqlStr) fmt.Println(sqlStr)
fmt.Println(args...) fmt.Println(args...)
} }
smt, err1 := db.linkCommon.Prepare(sqlStr) smt, err1 := ex.LinkCommon.Prepare(sqlStr)
if err1 != nil { if err1 != nil {
return nil, err1 return nil, err1
} }
@@ -452,13 +454,13 @@ func (db *Executor) Exec(sqlStr string, args ...interface{}) (sql.Result, error)
return nil, err2 return nil, err2
} }
db.clear() //ex.clear()
return res, nil return res, nil
} }
// ExecAffected 通用执行-更新,删除 // ExecAffected 通用执行-更新,删除
func (db *Executor) ExecAffected(sqlStr string, args ...interface{}) (int64, error) { func (ex *Executor) ExecAffected(sqlStr string, args ...interface{}) (int64, error) {
res, err := db.Exec(sqlStr, args...) res, err := ex.Exec(sqlStr, args...)
if err != nil { if err != nil {
return 0, err return 0, err
} }
@@ -472,400 +474,400 @@ func (db *Executor) ExecAffected(sqlStr string, args ...interface{}) (int64, err
} }
// Debug 链式操作-是否开启调试,打印sql // Debug 链式操作-是否开启调试,打印sql
func (db *Executor) Debug(isDebug bool) *Executor { func (ex *Executor) Debug(isDebug bool) *Executor {
db.isDebug = isDebug ex.isDebug = isDebug
return db return ex
} }
// Select 链式操作-查询哪些字段,默认 * // Select 链式操作-查询哪些字段,默认 *
func (db *Executor) Select(fields ...string) *Executor { func (ex *Executor) Select(fields ...string) *Executor {
db.selectList = append(db.selectList, fields...) ex.selectList = append(ex.selectList, fields...)
return db return ex
} }
// SelectCount 链式操作-count(field) as field_new // SelectCount 链式操作-count(field) as field_new
func (db *Executor) SelectCount(field string, fieldNew string) *Executor { func (ex *Executor) SelectCount(field string, fieldNew string) *Executor {
db.selectList = append(db.selectList, "count("+field+") AS "+fieldNew) ex.selectList = append(ex.selectList, "count("+field+") AS "+fieldNew)
return db return ex
} }
// SelectSum 链式操作-sum(field) as field_new // SelectSum 链式操作-sum(field) as field_new
func (db *Executor) SelectSum(field string, fieldNew string) *Executor { func (ex *Executor) SelectSum(field string, fieldNew string) *Executor {
db.selectList = append(db.selectList, "sum("+field+") AS "+fieldNew) ex.selectList = append(ex.selectList, "sum("+field+") AS "+fieldNew)
return db return ex
} }
// SelectMin 链式操作-min(field) as field_new // SelectMin 链式操作-min(field) as field_new
func (db *Executor) SelectMin(field string, fieldNew string) *Executor { func (ex *Executor) SelectMin(field string, fieldNew string) *Executor {
db.selectList = append(db.selectList, "min("+field+") AS "+fieldNew) ex.selectList = append(ex.selectList, "min("+field+") AS "+fieldNew)
return db return ex
} }
// SelectMax 链式操作-max(field) as field_new // SelectMax 链式操作-max(field) as field_new
func (db *Executor) SelectMax(field string, fieldNew string) *Executor { func (ex *Executor) SelectMax(field string, fieldNew string) *Executor {
db.selectList = append(db.selectList, "max("+field+") AS "+fieldNew) ex.selectList = append(ex.selectList, "max("+field+") AS "+fieldNew)
return db return ex
} }
// SelectAvg 链式操作-avg(field) as field_new // SelectAvg 链式操作-avg(field) as field_new
func (db *Executor) SelectAvg(field string, fieldNew string) *Executor { func (ex *Executor) SelectAvg(field string, fieldNew string) *Executor {
db.selectList = append(db.selectList, "avg("+field+") AS "+fieldNew) ex.selectList = append(ex.selectList, "avg("+field+") AS "+fieldNew)
return db return ex
} }
// SelectExp 链式操作-表达式 // SelectExp 链式操作-表达式
func (db *Executor) SelectExp(dbSub **Executor, fieldName string) *Executor { func (ex *Executor) SelectExp(dbSub **Executor, fieldName string) *Executor {
db.selectExpList = append(db.selectExpList, &ExpItem{ ex.selectExpList = append(ex.selectExpList, &ExpItem{
Executor: dbSub, Executor: dbSub,
FieldName: fieldName, FieldName: fieldName,
}) })
return db return ex
} }
// Table 链式操作-从哪个表查询,允许直接写别名,例如 person p // Table 链式操作-从哪个表查询,允许直接写别名,例如 person p
func (db *Executor) Table(tableName string) *Executor { func (ex *Executor) Table(tableName string) *Executor {
db.tableName = tableName ex.tableName = tableName
return db return ex
} }
// LeftJoin 链式操作,左联查询,例如 LeftJoin("project p", "p.project_id=o.project_id") // LeftJoin 链式操作,左联查询,例如 LeftJoin("project p", "p.project_id=o.project_id")
func (db *Executor) LeftJoin(tableName string, condition string) *Executor { func (ex *Executor) LeftJoin(tableName string, condition string) *Executor {
db.joinList = append(db.joinList, "LEFT JOIN "+tableName+" ON "+condition) ex.joinList = append(ex.joinList, "LEFT JOIN "+tableName+" ON "+condition)
return db return ex
} }
// RightJoin 链式操作,右联查询,例如 RightJoin("project p", "p.project_id=o.project_id") // RightJoin 链式操作,右联查询,例如 RightJoin("project p", "p.project_id=o.project_id")
func (db *Executor) RightJoin(tableName string, condition string) *Executor { func (ex *Executor) RightJoin(tableName string, condition string) *Executor {
db.joinList = append(db.joinList, "RIGHT JOIN "+tableName+" ON "+condition) ex.joinList = append(ex.joinList, "RIGHT JOIN "+tableName+" ON "+condition)
return db return ex
} }
// Join 链式操作,内联查询,例如 Join("project p", "p.project_id=o.project_id") // Join 链式操作,内联查询,例如 Join("project p", "p.project_id=o.project_id")
func (db *Executor) Join(tableName string, condition string) *Executor { func (ex *Executor) Join(tableName string, condition string) *Executor {
db.joinList = append(db.joinList, "INNER JOIN "+tableName+" ON "+condition) ex.joinList = append(ex.joinList, "INNER JOIN "+tableName+" ON "+condition)
return db return ex
} }
// Where 链式操作,以对象作为查询条件 // Where 链式操作,以对象作为查询条件
func (db *Executor) Where(dest interface{}) *Executor { func (ex *Executor) Where(dest interface{}) *Executor {
typeOf := reflect.TypeOf(dest) typeOf := reflect.TypeOf(dest)
valueOf := reflect.ValueOf(dest) valueOf := reflect.ValueOf(dest)
//如果没有设置表名 //如果没有设置表名
if db.tableName == "" { if ex.tableName == "" {
db.tableName = reflectTableName(typeOf, valueOf) ex.tableName = reflectTableName(typeOf, valueOf)
} }
for i := 0; i < typeOf.Elem().NumField(); i++ { for i := 0; i < typeOf.Elem().NumField(); i++ {
isNotNull := valueOf.Elem().Field(i).Field(0).Field(1).Bool() isNotNull := valueOf.Elem().Field(i).Field(0).Field(1).Bool()
if isNotNull { if isNotNull {
key := UnderLine(typeOf.Elem().Field(i).Name) key := aorm.UnderLine(typeOf.Elem().Field(i).Name)
val := valueOf.Elem().Field(i).Field(0).Field(0).Interface() val := valueOf.Elem().Field(i).Field(0).Field(0).Interface()
db.whereList = append(db.whereList, WhereItem{Field: key, Opt: Eq, Val: val}) ex.whereList = append(ex.whereList, WhereItem{Field: key, Opt: Eq, Val: val})
} }
} }
return db return ex
} }
// WhereArr 链式操作,以数组作为查询条件 // WhereArr 链式操作,以数组作为查询条件
func (db *Executor) WhereArr(whereList []WhereItem) *Executor { func (ex *Executor) WhereArr(whereList []WhereItem) *Executor {
db.whereList = append(db.whereList, whereList...) ex.whereList = append(ex.whereList, whereList...)
return db return ex
} }
func (db *Executor) WhereEq(field string, val interface{}) *Executor { func (ex *Executor) WhereEq(field string, val interface{}) *Executor {
db.whereList = append(db.whereList, WhereItem{ ex.whereList = append(ex.whereList, WhereItem{
Field: field, Field: field,
Opt: Eq, Opt: Eq,
Val: val, Val: val,
}) })
return db return ex
} }
func (db *Executor) WhereNe(field string, val interface{}) *Executor { func (ex *Executor) WhereNe(field string, val interface{}) *Executor {
db.whereList = append(db.whereList, WhereItem{ ex.whereList = append(ex.whereList, WhereItem{
Field: field, Field: field,
Opt: Ne, Opt: Ne,
Val: val, Val: val,
}) })
return db return ex
} }
func (db *Executor) WhereGt(field string, val interface{}) *Executor { func (ex *Executor) WhereGt(field string, val interface{}) *Executor {
db.whereList = append(db.whereList, WhereItem{ ex.whereList = append(ex.whereList, WhereItem{
Field: field, Field: field,
Opt: Gt, Opt: Gt,
Val: val, Val: val,
}) })
return db return ex
} }
func (db *Executor) WhereGe(field string, val interface{}) *Executor { func (ex *Executor) WhereGe(field string, val interface{}) *Executor {
db.whereList = append(db.whereList, WhereItem{ ex.whereList = append(ex.whereList, WhereItem{
Field: field, Field: field,
Opt: Ge, Opt: Ge,
Val: val, Val: val,
}) })
return db return ex
} }
func (db *Executor) WhereLt(field string, val interface{}) *Executor { func (ex *Executor) WhereLt(field string, val interface{}) *Executor {
db.whereList = append(db.whereList, WhereItem{ ex.whereList = append(ex.whereList, WhereItem{
Field: field, Field: field,
Opt: Lt, Opt: Lt,
Val: val, Val: val,
}) })
return db return ex
} }
func (db *Executor) WhereLe(field string, val interface{}) *Executor { func (ex *Executor) WhereLe(field string, val interface{}) *Executor {
db.whereList = append(db.whereList, WhereItem{ ex.whereList = append(ex.whereList, WhereItem{
Field: field, Field: field,
Opt: Le, Opt: Le,
Val: val, Val: val,
}) })
return db return ex
} }
func (db *Executor) WhereIn(field string, val interface{}) *Executor { func (ex *Executor) WhereIn(field string, val interface{}) *Executor {
db.whereList = append(db.whereList, WhereItem{ ex.whereList = append(ex.whereList, WhereItem{
Field: field, Field: field,
Opt: In, Opt: In,
Val: val, Val: val,
}) })
return db return ex
} }
func (db *Executor) WhereNotIn(field string, val interface{}) *Executor { func (ex *Executor) WhereNotIn(field string, val interface{}) *Executor {
db.whereList = append(db.whereList, WhereItem{ ex.whereList = append(ex.whereList, WhereItem{
Field: field, Field: field,
Opt: NotIn, Opt: NotIn,
Val: val, Val: val,
}) })
return db return ex
} }
func (db *Executor) WhereBetween(field string, val interface{}) *Executor { func (ex *Executor) WhereBetween(field string, val interface{}) *Executor {
db.whereList = append(db.whereList, WhereItem{ ex.whereList = append(ex.whereList, WhereItem{
Field: field, Field: field,
Opt: Between, Opt: Between,
Val: val, Val: val,
}) })
return db return ex
} }
func (db *Executor) WhereNotBetween(field string, val interface{}) *Executor { func (ex *Executor) WhereNotBetween(field string, val interface{}) *Executor {
db.whereList = append(db.whereList, WhereItem{ ex.whereList = append(ex.whereList, WhereItem{
Field: field, Field: field,
Opt: NotBetween, Opt: NotBetween,
Val: val, Val: val,
}) })
return db return ex
} }
func (db *Executor) WhereLike(field string, val interface{}) *Executor { func (ex *Executor) WhereLike(field string, val interface{}) *Executor {
db.whereList = append(db.whereList, WhereItem{ ex.whereList = append(ex.whereList, WhereItem{
Field: field, Field: field,
Opt: Like, Opt: Like,
Val: val, Val: val,
}) })
return db return ex
} }
func (db *Executor) WhereNotLike(field string, val interface{}) *Executor { func (ex *Executor) WhereNotLike(field string, val interface{}) *Executor {
db.whereList = append(db.whereList, WhereItem{ ex.whereList = append(ex.whereList, WhereItem{
Field: field, Field: field,
Opt: NotLike, Opt: NotLike,
Val: val, Val: val,
}) })
return db return ex
} }
func (db *Executor) WhereRaw(field string, val interface{}) *Executor { func (ex *Executor) WhereRaw(field string, val interface{}) *Executor {
db.whereList = append(db.whereList, WhereItem{ ex.whereList = append(ex.whereList, WhereItem{
Field: field, Field: field,
Opt: Raw, Opt: Raw,
Val: val, Val: val,
}) })
return db return ex
} }
// GroupBy 链式操作,以某字段进行分组 // GroupBy 链式操作,以某字段进行分组
func (db *Executor) GroupBy(fieldName string) *Executor { func (ex *Executor) GroupBy(fieldName string) *Executor {
db.groupList = append(db.groupList, fieldName) ex.groupList = append(ex.groupList, fieldName)
return db return ex
} }
// Having 链式操作,以对象作为筛选条件 // Having 链式操作,以对象作为筛选条件
func (db *Executor) Having(dest interface{}) *Executor { func (ex *Executor) Having(dest interface{}) *Executor {
typeOf := reflect.TypeOf(dest) typeOf := reflect.TypeOf(dest)
valueOf := reflect.ValueOf(dest) valueOf := reflect.ValueOf(dest)
//如果没有设置表名 //如果没有设置表名
if db.tableName == "" { if ex.tableName == "" {
db.tableName = reflectTableName(typeOf, valueOf) ex.tableName = reflectTableName(typeOf, valueOf)
} }
for i := 0; i < typeOf.Elem().NumField(); i++ { for i := 0; i < typeOf.Elem().NumField(); i++ {
isNotNull := valueOf.Elem().Field(i).Field(0).Field(1).Bool() isNotNull := valueOf.Elem().Field(i).Field(0).Field(1).Bool()
if isNotNull { if isNotNull {
key := UnderLine(typeOf.Elem().Field(i).Name) key := aorm.UnderLine(typeOf.Elem().Field(i).Name)
val := valueOf.Elem().Field(i).Field(0).Field(0).Interface() val := valueOf.Elem().Field(i).Field(0).Field(0).Interface()
db.havingList = append(db.havingList, WhereItem{Field: key, Opt: Eq, Val: val}) ex.havingList = append(ex.havingList, WhereItem{Field: key, Opt: Eq, Val: val})
} }
} }
return db return ex
} }
// HavingArr 链式操作,以数组作为筛选条件 // HavingArr 链式操作,以数组作为筛选条件
func (db *Executor) HavingArr(havingList []WhereItem) *Executor { func (ex *Executor) HavingArr(havingList []WhereItem) *Executor {
db.havingList = append(db.havingList, havingList...) ex.havingList = append(ex.havingList, havingList...)
return db return ex
} }
func (db *Executor) HavingEq(field string, val interface{}) *Executor { func (ex *Executor) HavingEq(field string, val interface{}) *Executor {
db.havingList = append(db.havingList, WhereItem{ ex.havingList = append(ex.havingList, WhereItem{
Field: field, Field: field,
Opt: Eq, Opt: Eq,
Val: val, Val: val,
}) })
return db return ex
} }
func (db *Executor) HavingNe(field string, val interface{}) *Executor { func (ex *Executor) HavingNe(field string, val interface{}) *Executor {
db.havingList = append(db.havingList, WhereItem{ ex.havingList = append(ex.havingList, WhereItem{
Field: field, Field: field,
Opt: Ne, Opt: Ne,
Val: val, Val: val,
}) })
return db return ex
} }
func (db *Executor) HavingGt(field string, val interface{}) *Executor { func (ex *Executor) HavingGt(field string, val interface{}) *Executor {
db.havingList = append(db.havingList, WhereItem{ ex.havingList = append(ex.havingList, WhereItem{
Field: field, Field: field,
Opt: Gt, Opt: Gt,
Val: val, Val: val,
}) })
return db return ex
} }
func (db *Executor) HavingGe(field string, val interface{}) *Executor { func (ex *Executor) HavingGe(field string, val interface{}) *Executor {
db.havingList = append(db.havingList, WhereItem{ ex.havingList = append(ex.havingList, WhereItem{
Field: field, Field: field,
Opt: Ge, Opt: Ge,
Val: val, Val: val,
}) })
return db return ex
} }
func (db *Executor) HavingLt(field string, val interface{}) *Executor { func (ex *Executor) HavingLt(field string, val interface{}) *Executor {
db.havingList = append(db.havingList, WhereItem{ ex.havingList = append(ex.havingList, WhereItem{
Field: field, Field: field,
Opt: Lt, Opt: Lt,
Val: val, Val: val,
}) })
return db return ex
} }
func (db *Executor) HavingLe(field string, val interface{}) *Executor { func (ex *Executor) HavingLe(field string, val interface{}) *Executor {
db.havingList = append(db.havingList, WhereItem{ ex.havingList = append(ex.havingList, WhereItem{
Field: field, Field: field,
Opt: Le, Opt: Le,
Val: val, Val: val,
}) })
return db return ex
} }
func (db *Executor) HavingIn(field string, val interface{}) *Executor { func (ex *Executor) HavingIn(field string, val interface{}) *Executor {
db.havingList = append(db.havingList, WhereItem{ ex.havingList = append(ex.havingList, WhereItem{
Field: field, Field: field,
Opt: In, Opt: In,
Val: val, Val: val,
}) })
return db return ex
} }
func (db *Executor) HavingNotIn(field string, val interface{}) *Executor { func (ex *Executor) HavingNotIn(field string, val interface{}) *Executor {
db.havingList = append(db.havingList, WhereItem{ ex.havingList = append(ex.havingList, WhereItem{
Field: field, Field: field,
Opt: NotIn, Opt: NotIn,
Val: val, Val: val,
}) })
return db return ex
} }
func (db *Executor) HavingBetween(field string, val interface{}) *Executor { func (ex *Executor) HavingBetween(field string, val interface{}) *Executor {
db.havingList = append(db.havingList, WhereItem{ ex.havingList = append(ex.havingList, WhereItem{
Field: field, Field: field,
Opt: Between, Opt: Between,
Val: val, Val: val,
}) })
return db return ex
} }
func (db *Executor) HavingNotBetween(field string, val interface{}) *Executor { func (ex *Executor) HavingNotBetween(field string, val interface{}) *Executor {
db.havingList = append(db.havingList, WhereItem{ ex.havingList = append(ex.havingList, WhereItem{
Field: field, Field: field,
Opt: NotBetween, Opt: NotBetween,
Val: val, Val: val,
}) })
return db return ex
} }
func (db *Executor) HavingLike(field string, val interface{}) *Executor { func (ex *Executor) HavingLike(field string, val interface{}) *Executor {
db.havingList = append(db.havingList, WhereItem{ ex.havingList = append(ex.havingList, WhereItem{
Field: field, Field: field,
Opt: Like, Opt: Like,
Val: val, Val: val,
}) })
return db return ex
} }
func (db *Executor) HavingNotLike(field string, val interface{}) *Executor { func (ex *Executor) HavingNotLike(field string, val interface{}) *Executor {
db.havingList = append(db.havingList, WhereItem{ ex.havingList = append(ex.havingList, WhereItem{
Field: field, Field: field,
Opt: NotLike, Opt: NotLike,
Val: val, Val: val,
}) })
return db return ex
} }
func (db *Executor) HavingRaw(field string, val interface{}) *Executor { func (ex *Executor) HavingRaw(field string, val interface{}) *Executor {
db.havingList = append(db.havingList, WhereItem{ ex.havingList = append(ex.havingList, WhereItem{
Field: field, Field: field,
Opt: Raw, Opt: Raw,
Val: val, Val: val,
}) })
return db return ex
} }
// OrderBy 链式操作,以某字段进行排序 // OrderBy 链式操作,以某字段进行排序
func (db *Executor) OrderBy(field string, orderType string) *Executor { func (ex *Executor) OrderBy(field string, orderType string) *Executor {
db.orderList = append(db.orderList, field+" "+orderType) ex.orderList = append(ex.orderList, field+" "+orderType)
return db return ex
} }
// Limit 链式操作,分页 // Limit 链式操作,分页
func (db *Executor) Limit(offset int, pageSize int) *Executor { func (ex *Executor) Limit(offset int, pageSize int) *Executor {
db.offset = offset ex.offset = offset
db.pageSize = pageSize ex.pageSize = pageSize
return db return ex
} }
// Page 链式操作,分页 // Page 链式操作,分页
func (db *Executor) Page(pageNum int, pageSize int) *Executor { func (ex *Executor) Page(pageNum int, pageSize int) *Executor {
db.offset = (pageNum - 1) * pageSize ex.offset = (pageNum - 1) * pageSize
db.pageSize = pageSize ex.pageSize = pageSize
return db return ex
} }
// LockForUpdate 加锁 // LockForUpdate 加锁
func (db *Executor) LockForUpdate(isLockForUpdate bool) *Executor { func (ex *Executor) LockForUpdate(isLockForUpdate bool) *Executor {
db.isLockForUpdate = isLockForUpdate ex.isLockForUpdate = isLockForUpdate
return db return ex
} }
//拼接SQL,字段相关 //拼接SQL,字段相关
@@ -897,20 +899,20 @@ func handleWhere(where []WhereItem, paramList []any) (string, []any) {
} }
//拼接SQL,更新信息 //拼接SQL,更新信息
func (db *Executor) handleSet(dest interface{}, paramList []any) (string, []any) { func (ex *Executor) handleSet(dest interface{}, paramList []any) (string, []any) {
typeOf := reflect.TypeOf(dest) typeOf := reflect.TypeOf(dest)
valueOf := reflect.ValueOf(dest) valueOf := reflect.ValueOf(dest)
//如果没有设置表名 //如果没有设置表名
if db.tableName == "" { if ex.tableName == "" {
db.tableName = reflectTableName(typeOf, valueOf) ex.tableName = reflectTableName(typeOf, valueOf)
} }
var keys []string var keys []string
for i := 0; i < typeOf.Elem().NumField(); i++ { for i := 0; i < typeOf.Elem().NumField(); i++ {
isNotNull := valueOf.Elem().Field(i).Field(0).Field(1).Bool() isNotNull := valueOf.Elem().Field(i).Field(0).Field(1).Bool()
if isNotNull { if isNotNull {
key := UnderLine(typeOf.Elem().Field(i).Name) key := aorm.UnderLine(typeOf.Elem().Field(i).Name)
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+"=?")
@@ -984,7 +986,7 @@ func handleLockForUpdate(isLock bool) string {
func whereAndHaving(where []WhereItem, paramList []any) ([]string, []any) { func whereAndHaving(where []WhereItem, paramList []any) ([]string, []any) {
var whereList []string var whereList []string
for i := 0; i < len(where); i++ { for i := 0; i < len(where); i++ {
if "**aorm.Executor" == reflect.TypeOf(where[i].Val).String() { if "**Executor" == reflect.TypeOf(where[i].Val).String() {
executor := *(**Executor)(unsafe.Pointer(reflect.ValueOf(where[i].Val).Pointer())) executor := *(**Executor)(unsafe.Pointer(reflect.ValueOf(where[i].Val).Pointer()))
subSql, subParams := executor.GetSqlAndParams() subSql, subParams := executor.GetSqlAndParams()
@@ -1092,7 +1094,7 @@ func reflectTableName(typeOf reflect.Type, valueOf reflect.Value) string {
return res[0].String() return res[0].String()
} else { } else {
arr := strings.Split(typeOf.String(), ".") arr := strings.Split(typeOf.String(), ".")
return UnderLine(arr[len(arr)-1]) return aorm.UnderLine(arr[len(arr)-1])
} }
} }
@@ -1108,7 +1110,7 @@ func getFieldNameMap(destValue reflect.Value, destType reflect.Type) map[string]
func getScans(columnNameList []string, fieldNameMap map[string]int, destValue reflect.Value) []interface{} { func getScans(columnNameList []string, fieldNameMap map[string]int, destValue reflect.Value) []interface{} {
var scans []interface{} var scans []interface{}
for _, columnName := range columnNameList { for _, columnName := range columnNameList {
fieldName := CamelString(strings.ToLower(columnName)) fieldName := aorm.CamelString(strings.ToLower(columnName))
index, ok := fieldNameMap[fieldName] index, ok := fieldNameMap[fieldName]
if ok { if ok {
scans = append(scans, destValue.Field(index).Addr().Interface()) scans = append(scans, destValue.Field(index).Addr().Interface())

52
executor/model.go Normal file
View File

@@ -0,0 +1,52 @@
package executor
import "database/sql"
// LinkCommon database/sql提供的库连接与事务二者有很多方法是一致的为了通用抽象为该interface
type LinkCommon interface {
Exec(query string, args ...interface{}) (sql.Result, error)
Prepare(query string) (*sql.Stmt, error)
Query(query string, args ...interface{}) (*sql.Rows, error)
QueryRow(query string, args ...interface{}) *sql.Row
}
// ExpItem 将某子语句重命名为某字段
type ExpItem struct {
Executor **Executor
FieldName string
}
// Executor 查询记录所需要的条件
type Executor struct {
//数据库操作连接
LinkCommon LinkCommon
//查询参数
tableName string
selectList []string
selectExpList []*ExpItem
groupList []string
whereList []WhereItem
joinList []string
havingList []WhereItem
orderList []string
offset int
pageSize int
isDebug bool
isLockForUpdate bool
//sql与参数
sql string
paramList []interface{}
//表属性
opinionList []OpinionItem
//驱动名字
driverName string
}
type OpinionItem struct {
Key string
Val string
}

View File

@@ -1,490 +1,456 @@
package aorm package aorm
import ( import (
"fmt" "github.com/tangpanqing/aorm/executor"
"github.com/tangpanqing/aorm/migrate_mysql"
"reflect" "reflect"
"strconv"
"strings" "strings"
) )
type Table struct { func (ex *executor.Executor) Driver(driverName string) *executor.Executor {
TableName String ex.driverName = driverName
Engine String return ex
TableComment String
} }
type Column struct { func (ex *executor.Executor) Opinion(key string, val string) *executor.Executor {
ColumnName String
ColumnDefault String
IsNullable String
DataType String //数据类型 varchar,bigint,int
MaxLength Int //数据最大长度 20
ColumnComment String
Extra String //扩展信息 auto_increment
}
type Index struct {
NonUnique int
ColumnName string
KeyName string
}
type OpinionItem struct {
Key string
Val string
}
func (db *Executor) Opinion(key string, val string) *Executor {
if key == "COMMENT" { if key == "COMMENT" {
val = "'" + val + "'" val = "'" + val + "'"
} }
db.opinionList = append(db.opinionList, OpinionItem{Key: key, Val: val}) ex.opinionList = append(ex.opinionList, OpinionItem{Key: key, Val: val})
return db return ex
} }
func (db *Executor) ShowCreateTable(tableName string) string { //ShowCreateTable 获取创建表的ddl
var str string func (ex *executor.Executor) ShowCreateTable(tableName string) string {
db.RawSql("show create table "+tableName).Value("Create Table", &str) if ex.driverName == "mysql" {
return str cr := migrate_mysql.MigrateExecutor{}
return cr.SetEx(ex).ShowCreateTable(tableName)
}
return ""
} }
// AutoMigrate 迁移数据库结构,需要输入数据库名,表名自动获取 // AutoMigrate 迁移数据库结构,需要输入数据库名,表名自动获取
func (db *Executor) AutoMigrate(dest interface{}) { func (ex *Executor) AutoMigrate(dest interface{}) {
typeOf := reflect.TypeOf(dest) typeOf := reflect.TypeOf(dest)
arr := strings.Split(typeOf.String(), ".") arr := strings.Split(typeOf.String(), ".")
tableName := UnderLine(arr[len(arr)-1]) tableName := UnderLine(arr[len(arr)-1])
db.migrateCommon(tableName, typeOf) ex.migrateCommon(tableName, typeOf)
} }
// Migrate 自动迁移数据库结构,需要输入数据库名,表名 // Migrate 自动迁移数据库结构,需要输入数据库名,表名
func (db *Executor) Migrate(tableName string, dest interface{}) { func (ex *Executor) Migrate(tableName string, dest interface{}) {
typeOf := reflect.TypeOf(dest) typeOf := reflect.TypeOf(dest)
db.migrateCommon(tableName, typeOf) ex.migrateCommon(tableName, typeOf)
} }
func (db *Executor) migrateCommon(tableName string, typeOf reflect.Type) error { func (ex *Executor) migrateCommon(tableName string, typeOf reflect.Type) {
tableFromCode := db.getTableFromCode(tableName) if ex.driverName == "mysql" {
columnsFromCode := db.getColumnsFromCode(typeOf) cr := migrate_mysql.MigrateExecutor{}
indexsFromCode := db.getIndexsFromCode(typeOf, tableFromCode) cr.SetEx(ex).MigrateCommon(tableName, typeOf)
//获取数据库名称
var dbName string
err := db.RawSql("SELECT DATABASE()").Value("DATABASE()", &dbName)
if err != nil {
fmt.Println(err.Error())
return err
} }
//查询表信息,如果找不到就新建 if ex.driverName == "sqlite3" {
sql := "SELECT TABLE_NAME,ENGINE,TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA =" + "'" + dbName + "' AND TABLE_NAME =" + "'" + tableName + "'" //cr := migrate_sqlite3.MigrateExecutor{
var dataList []Table // Ex: ex,
db.RawSql(sql).GetMany(&dataList) //}
for i := 0; i < len(dataList); i++ { //cr.MigrateCommon(tableName, typeOf)
dataList[i].TableComment = StringFrom("'" + dataList[i].TableComment.String + "'")
}
if len(dataList) != 0 {
tableFromDb := dataList[0]
columnsFromDb := db.getColumnsFromDb(dbName, tableName)
indexsFromDb := db.getIndexsFromDb(tableName)
db.modifyTable(tableFromCode, columnsFromCode, indexsFromCode, tableFromDb, columnsFromDb, indexsFromDb)
} else {
db.createTable(tableFromCode, columnsFromCode, indexsFromCode)
}
return nil
}
func (db *Executor) getTableFromCode(tableName string) Table {
var tableFromCode Table
tableFromCode.TableName = StringFrom(tableName)
tableFromCode.Engine = StringFrom(db.getValFromOpinion("ENGINE", "MyISAM"))
tableFromCode.TableComment = StringFrom(db.getValFromOpinion("COMMENT", ""))
return tableFromCode
}
func (db *Executor) getColumnsFromCode(typeOf reflect.Type) []Column {
var columnsFromCode []Column
for i := 0; i < typeOf.Elem().NumField(); i++ {
fieldName := UnderLine(typeOf.Elem().Field(i).Name)
fieldType := typeOf.Elem().Field(i).Type.Name()
fieldMap := getTagMap(typeOf.Elem().Field(i).Tag.Get("aorm"))
columnsFromCode = append(columnsFromCode, getColumnFromCode(fieldName, fieldType, fieldMap))
}
return columnsFromCode
}
func (db *Executor) getIndexsFromCode(typeOf reflect.Type, tableFromCode Table) []Index {
var indexsFromCode []Index
for i := 0; i < typeOf.Elem().NumField(); i++ {
fieldName := UnderLine(typeOf.Elem().Field(i).Name)
fieldMap := getTagMap(typeOf.Elem().Field(i).Tag.Get("aorm"))
_, primaryIs := fieldMap["primary"]
if primaryIs {
indexsFromCode = append(indexsFromCode, Index{
NonUnique: 0,
ColumnName: fieldName,
KeyName: "PRIMARY",
})
}
_, uniqueIndexIs := fieldMap["unique"]
if uniqueIndexIs {
indexsFromCode = append(indexsFromCode, Index{
NonUnique: 0,
ColumnName: fieldName,
KeyName: "idx_" + tableFromCode.TableName.String + "_" + fieldName,
})
}
_, indexIs := fieldMap["index"]
if indexIs {
indexsFromCode = append(indexsFromCode, Index{
NonUnique: 1,
ColumnName: fieldName,
KeyName: "idx_" + tableFromCode.TableName.String + "_" + fieldName,
})
} }
} }
return indexsFromCode func (ex *Executor) GetOpinionList() []OpinionItem {
} return ex.opinionList
func (db *Executor) getColumnsFromDb(dbName string, tableName string) []Column {
var columnsFromDb []Column
sqlColumn := "SELECT COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH as Max_Length,COLUMN_DEFAULT,COLUMN_COMMENT,EXTRA,IS_NULLABLE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA =" + "'" + dbName + "' AND TABLE_NAME =" + "'" + tableName + "'"
db.RawSql(sqlColumn).GetMany(&columnsFromDb)
for j := 0; j < len(columnsFromDb); j++ {
if columnsFromDb[j].DataType.String == "text" && columnsFromDb[j].MaxLength.Int64 == 65535 {
columnsFromDb[j].MaxLength = IntFrom(0)
}
}
return columnsFromDb
}
func (db *Executor) getIndexsFromDb(tableName string) []Index {
sqlIndex := "SHOW INDEXES FROM " + tableName
var indexsFromDb []Index
db.RawSql(sqlIndex).GetMany(&indexsFromDb)
return indexsFromDb
}
// 修改表
func (db *Executor) modifyTable(tableFromCode Table, columnsFromCode []Column, indexsFromCode []Index, tableFromDb Table, columnsFromDb []Column, indexsFromDb []Index) {
if tableFromCode.Engine != tableFromDb.Engine {
sql := "ALTER TABLE " + tableFromCode.TableName.String + " Engine " + tableFromCode.Engine.String
_, err := db.Exec(sql)
if err != nil {
fmt.Println(err)
} else {
fmt.Println("修改表:" + sql)
}
}
if tableFromCode.TableComment != tableFromDb.TableComment {
sql := "ALTER TABLE " + tableFromCode.TableName.String + " Comment " + tableFromCode.TableComment.String
_, err := db.Exec(sql)
if err != nil {
fmt.Println(err)
} else {
fmt.Println("修改表:" + sql)
}
}
for i := 0; i < len(columnsFromCode); i++ {
isFind := 0
columnCode := columnsFromCode[i]
for j := 0; j < len(columnsFromDb); j++ {
columnDb := columnsFromDb[j]
if columnCode.ColumnName == columnDb.ColumnName {
isFind = 1
if columnCode.DataType.String != columnDb.DataType.String ||
columnCode.MaxLength.Int64 != columnDb.MaxLength.Int64 ||
columnCode.ColumnComment.String != columnDb.ColumnComment.String ||
columnCode.Extra.String != columnDb.Extra.String ||
columnCode.ColumnDefault.String != columnDb.ColumnDefault.String {
sql := "ALTER TABLE " + tableFromCode.TableName.String + " MODIFY " + getColumnStr(columnCode)
_, err := db.Exec(sql)
if err != nil {
fmt.Println(err)
} else {
fmt.Println("修改属性:" + sql)
}
}
}
}
if isFind == 0 {
sql := "ALTER TABLE " + tableFromCode.TableName.String + " ADD " + getColumnStr(columnCode)
_, err := db.Exec(sql)
if err != nil {
fmt.Println(err)
} else {
fmt.Println("增加属性:" + sql)
}
}
}
for i := 0; i < len(indexsFromCode); i++ {
isFind := 0
indexCode := indexsFromCode[i]
for j := 0; j < len(indexsFromDb); j++ {
indexDb := indexsFromDb[j]
if indexCode.ColumnName == indexDb.ColumnName {
isFind = 1
if indexCode.KeyName != indexDb.KeyName || indexCode.NonUnique != indexDb.NonUnique {
sql := "ALTER TABLE " + tableFromCode.TableName.String + " MODIFY " + getIndexStr(indexCode)
_, err := db.Exec(sql)
if err != nil {
fmt.Println(err)
} else {
fmt.Println("修改索引:" + sql)
}
}
}
}
if isFind == 0 {
sql := "ALTER TABLE " + tableFromCode.TableName.String + " ADD " + getIndexStr(indexCode)
_, err := db.Exec(sql)
if err != nil {
fmt.Println(err)
} else {
fmt.Println("增加索引:" + sql)
}
}
}
}
// 创建表
func (db *Executor) createTable(tableFromCode Table, columnsFromCode []Column, indexsFromCode []Index) {
var fieldArr []string
for i := 0; i < len(columnsFromCode); i++ {
column := columnsFromCode[i]
fieldArr = append(fieldArr, getColumnStr(column))
}
for i := 0; i < len(indexsFromCode); i++ {
index := indexsFromCode[i]
fieldArr = append(fieldArr, getIndexStr(index))
}
sqlStr := "CREATE TABLE `" + tableFromCode.TableName.String + "` (\n" + strings.Join(fieldArr, ",\n") + "\n) " + getTableInfoFromCode(tableFromCode) + ";"
_, err := db.Exec(sqlStr)
if err != nil {
fmt.Println(err)
} else {
fmt.Println("创建表:" + tableFromCode.TableName.String)
}
} }
// //
func (db *Executor) getValFromOpinion(key string, def string) string { //func (ex *Executor) getTableFromCode(tableName string) Table {
for i := 0; i < len(db.opinionList); i++ { // var tableFromCode Table
opinionItem := db.opinionList[i] // tableFromCode.TableName = StringFrom(tableName)
if opinionItem.Key == key { // tableFromCode.Engine = StringFrom(ex.getValFromOpinion("ENGINE", "MyISAM"))
def = opinionItem.Val // tableFromCode.TableComment = StringFrom(ex.getValFromOpinion("COMMENT", ""))
} //
} // return tableFromCode
return def //}
} //
//func (ex *Executor) getColumnsFromCode(typeOf reflect.Type) []Column {
func getTableInfoFromCode(tableFromCode Table) string { // var columnsFromCode []Column
return " ENGINE " + tableFromCode.Engine.String + " COMMENT " + tableFromCode.TableComment.String // for i := 0; i < typeOf.Elem().NumField(); i++ {
} // fieldName := UnderLine(typeOf.Elem().Field(i).Name)
// fieldType := typeOf.Elem().Field(i).Type.Name()
// 获得某列的结构 // fieldMap := getTagMap(typeOf.Elem().Field(i).Tag.Get("aorm"))
func getColumnFromCode(fieldName string, fieldType string, fieldMap map[string]string) Column { // columnsFromCode = append(columnsFromCode, getColumnFromCode(fieldName, fieldType, fieldMap))
var column Column // }
//字段名 //
column.ColumnName = StringFrom(fieldName) // return columnsFromCode
//字段数据类型 //}
column.DataType = StringFrom(getDataType(fieldType, fieldMap)) //
//字段数据长度 //func (ex *Executor) getIndexsFromCode(typeOf reflect.Type, tableFromCode Table) []Index {
column.MaxLength = IntFrom(int64(getMaxLength(column.DataType.String, fieldMap))) // var indexsFromCode []Index
//字段是否可以为空 // for i := 0; i < typeOf.Elem().NumField(); i++ {
column.IsNullable = StringFrom(getNullAble(fieldMap)) // fieldName := UnderLine(typeOf.Elem().Field(i).Name)
//字段注释 // fieldMap := getTagMap(typeOf.Elem().Field(i).Tag.Get("aorm"))
column.ColumnComment = StringFrom(getComment(fieldMap)) //
//扩展信息 // _, primaryIs := fieldMap["primary"]
column.Extra = StringFrom(getExtra(fieldMap)) // if primaryIs {
//默认信息 // indexsFromCode = append(indexsFromCode, Index{
column.ColumnDefault = StringFrom(getDefaultVal(fieldMap)) // NonUnique: 0,
// ColumnName: fieldName,
return column // KeyName: "PRIMARY",
} // })
// }
// 转换tag成map //
func getTagMap(fieldTag string) map[string]string { // _, uniqueIndexIs := fieldMap["unique"]
var fieldMap = make(map[string]string) // if uniqueIndexIs {
if "" != fieldTag { // indexsFromCode = append(indexsFromCode, Index{
tagArr := strings.Split(fieldTag, ";") // NonUnique: 0,
for j := 0; j < len(tagArr); j++ { // ColumnName: fieldName,
tagArrArr := strings.Split(tagArr[j], ":") // KeyName: "idx_" + tableFromCode.TableName.String + "_" + fieldName,
fieldMap[tagArrArr[0]] = "" // })
if len(tagArrArr) > 1 { // }
fieldMap[tagArrArr[0]] = tagArrArr[1] //
} // _, indexIs := fieldMap["index"]
} // if indexIs {
} // indexsFromCode = append(indexsFromCode, Index{
return fieldMap // NonUnique: 1,
} // ColumnName: fieldName,
// KeyName: "idx_" + tableFromCode.TableName.String + "_" + fieldName,
func getColumnStr(column Column) string { // })
var strArr []string // }
strArr = append(strArr, column.ColumnName.String) // }
if column.MaxLength.Int64 == 0 { //
if column.DataType.String == "varchar" { // return indexsFromCode
strArr = append(strArr, column.DataType.String+"(255)") //}
} else { //
strArr = append(strArr, column.DataType.String) //func (ex *Executor) getColumnsFromDb(dbName string, tableName string) []Column {
} // var columnsFromDb []Column
} else { //
strArr = append(strArr, column.DataType.String+"("+strconv.Itoa(int(column.MaxLength.Int64))+")") // sqlColumn := "SELECT COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH as Max_Length,COLUMN_DEFAULT,COLUMN_COMMENT,EXTRA,IS_NULLABLE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA =" + "'" + dbName + "' AND TABLE_NAME =" + "'" + tableName + "'"
} // ex.RawSql(sqlColumn).GetMany(&columnsFromDb)
//
if column.ColumnDefault.String != "" { // for j := 0; j < len(columnsFromDb); j++ {
strArr = append(strArr, "DEFAULT '"+column.ColumnDefault.String+"'") // if columnsFromDb[j].DataType.String == "text" && columnsFromDb[j].MaxLength.Int64 == 65535 {
} // columnsFromDb[j].MaxLength = IntFrom(0)
// }
if column.IsNullable.String == "NO" { // }
strArr = append(strArr, "NOT NULL") //
} // return columnsFromDb
//}
if column.ColumnComment.String != "" { //
strArr = append(strArr, "COMMENT '"+column.ColumnComment.String+"'") //func (ex *Executor) getIndexsFromDb(tableName string) []Index {
} // sqlIndex := "SHOW INDEXES FROM " + tableName
//
if column.Extra.String != "" { // var indexsFromDb []Index
strArr = append(strArr, column.Extra.String) // ex.RawSql(sqlIndex).GetMany(&indexsFromDb)
} //
// return indexsFromDb
return strings.Join(strArr, " ") //}
} //
//// 修改表
func getIndexStr(index Index) string { //func (ex *Executor) modifyTable(tableFromCode Table, columnsFromCode []Column, indexsFromCode []Index, tableFromDb Table, columnsFromDb []Column, indexsFromDb []Index) {
var strArr []string // if tableFromCode.Engine != tableFromDb.Engine {
// sql := "ALTER TABLE " + tableFromCode.TableName.String + " Engine " + tableFromCode.Engine.String
if "PRIMARY" == index.KeyName { // _, err := ex.Exec(sql)
strArr = append(strArr, index.KeyName) // if err != nil {
strArr = append(strArr, "KEY") // fmt.Println(err)
strArr = append(strArr, "(`"+index.ColumnName+"`)") // } else {
} else { // fmt.Println("修改表:" + sql)
if 0 == index.NonUnique { // }
strArr = append(strArr, "Unique") // }
strArr = append(strArr, index.KeyName) //
strArr = append(strArr, "(`"+index.ColumnName+"`)") // if tableFromCode.TableComment != tableFromDb.TableComment {
} else { // sql := "ALTER TABLE " + tableFromCode.TableName.String + " Comment " + tableFromCode.TableComment.String
strArr = append(strArr, "Index") // _, err := ex.Exec(sql)
strArr = append(strArr, index.KeyName) // if err != nil {
strArr = append(strArr, "(`"+index.ColumnName+"`)") // fmt.Println(err)
} // } else {
} // fmt.Println("修改表:" + sql)
// }
return strings.Join(strArr, " ") // }
} //
// for i := 0; i < len(columnsFromCode); i++ {
//将对象属性类型转换数据库字段数据类型 // isFind := 0
func getDataType(fieldType string, fieldMap map[string]string) string { // columnCode := columnsFromCode[i]
var DataType string //
// for j := 0; j < len(columnsFromDb); j++ {
dataTypeVal, dataTypeOk := fieldMap["type"] // columnDb := columnsFromDb[j]
if dataTypeOk { // if columnCode.ColumnName == columnDb.ColumnName {
DataType = dataTypeVal // isFind = 1
} else { // if columnCode.DataType.String != columnDb.DataType.String ||
if "Int" == fieldType { // columnCode.MaxLength.Int64 != columnDb.MaxLength.Int64 ||
DataType = "int" // columnCode.ColumnComment.String != columnDb.ColumnComment.String ||
} // columnCode.Extra.String != columnDb.Extra.String ||
if "String" == fieldType { // columnCode.ColumnDefault.String != columnDb.ColumnDefault.String {
DataType = "varchar" // sql := "ALTER TABLE " + tableFromCode.TableName.String + " MODIFY " + getColumnStr(columnCode)
} // _, err := ex.Exec(sql)
if "Bool" == fieldType { // if err != nil {
DataType = "tinyint" // fmt.Println(err)
} // } else {
if "Time" == fieldType { // fmt.Println("修改属性:" + sql)
DataType = "datetime" // }
} // }
if "Float" == fieldType { // }
DataType = "float" // }
} //
} // if isFind == 0 {
// sql := "ALTER TABLE " + tableFromCode.TableName.String + " ADD " + getColumnStr(columnCode)
return DataType // _, err := ex.Exec(sql)
} // if err != nil {
// fmt.Println(err)
func getMaxLength(DataType string, fieldMap map[string]string) int { // } else {
var MaxLength int // fmt.Println("增加属性:" + sql)
// }
maxLengthVal, maxLengthOk := fieldMap["size"] // }
if maxLengthOk { // }
num, _ := strconv.Atoi(maxLengthVal) //
MaxLength = num // for i := 0; i < len(indexsFromCode); i++ {
} else { // isFind := 0
MaxLength = 0 // indexCode := indexsFromCode[i]
if "varchar" == DataType { //
MaxLength = 255 // for j := 0; j < len(indexsFromDb); j++ {
} // indexDb := indexsFromDb[j]
} // if indexCode.ColumnName == indexDb.ColumnName {
// isFind = 1
return MaxLength // if indexCode.KeyName != indexDb.KeyName || indexCode.NonUnique != indexDb.NonUnique {
} // sql := "ALTER TABLE " + tableFromCode.TableName.String + " MODIFY " + getIndexStr(indexCode)
// _, err := ex.Exec(sql)
func getNullAble(fieldMap map[string]string) string { // if err != nil {
var IsNullable string // fmt.Println(err)
// } else {
_, primaryOk := fieldMap["primary"] // fmt.Println("修改索引:" + sql)
if primaryOk { // }
IsNullable = "NO" // }
} else { // }
_, ok := fieldMap["not null"] // }
if ok { //
IsNullable = "NO" // if isFind == 0 {
} else { // sql := "ALTER TABLE " + tableFromCode.TableName.String + " ADD " + getIndexStr(indexCode)
IsNullable = "YES" // _, err := ex.Exec(sql)
} // if err != nil {
} // fmt.Println(err)
// } else {
return IsNullable // fmt.Println("增加索引:" + sql)
} // }
// }
func getComment(fieldMap map[string]string) string { // }
commentVal, commentIs := fieldMap["comment"] //}
if commentIs { //
return commentVal //// 创建表
} //func (ex *Executor) createTable(tableFromCode Table, columnsFromCode []Column, indexsFromCode []Index) {
// var fieldArr []string
return "" //
} // for i := 0; i < len(columnsFromCode); i++ {
// column := columnsFromCode[i]
func getExtra(fieldMap map[string]string) string { // fieldArr = append(fieldArr, getColumnStr(column))
_, commentIs := fieldMap["auto_increment"] // }
if commentIs { //
return "auto_increment" // for i := 0; i < len(indexsFromCode); i++ {
} // index := indexsFromCode[i]
// fieldArr = append(fieldArr, getIndexStr(index))
return "" // }
} //
// sqlStr := "CREATE TABLE `" + tableFromCode.TableName.String + "` (\n" + strings.Join(fieldArr, ",\n") + "\n) " + getTableInfoFromCode(tableFromCode) + ";"
func getDefaultVal(fieldMap map[string]string) string { // _, err := ex.Exec(sqlStr)
defaultVal, defaultIs := fieldMap["default"] // if err != nil {
if defaultIs { // fmt.Println(err)
return defaultVal // } else {
} // fmt.Println("创建表:" + tableFromCode.TableName.String)
// }
return "" //}
} //
////
//func (ex *Executor) getValFromOpinion(key string, def string) string {
// for i := 0; i < len(ex.opinionList); i++ {
// opinionItem := ex.opinionList[i]
// if opinionItem.Key == key {
// def = opinionItem.Val
// }
// }
// return def
//}
//
//func getTableInfoFromCode(tableFromCode Table) string {
// return " ENGINE " + tableFromCode.Engine.String + " COMMENT " + tableFromCode.TableComment.String
//}
//
//// 获得某列的结构
//func getColumnFromCode(fieldName string, fieldType string, fieldMap map[string]string) Column {
// var column Column
// //字段名
// column.ColumnName = StringFrom(fieldName)
// //字段数据类型
// column.DataType = StringFrom(getDataType(fieldType, fieldMap))
// //字段数据长度
// column.MaxLength = IntFrom(int64(getMaxLength(column.DataType.String, fieldMap)))
// //字段是否可以为空
// column.IsNullable = StringFrom(getNullAble(fieldMap))
// //字段注释
// column.ColumnComment = StringFrom(getComment(fieldMap))
// //扩展信息
// column.Extra = StringFrom(getExtra(fieldMap))
// //默认信息
// column.ColumnDefault = StringFrom(getDefaultVal(fieldMap))
//
// return column
//}
//
//// 转换tag成map
//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
//}
//
//func getColumnStr(column Column) string {
// var strArr []string
// strArr = append(strArr, column.ColumnName.String)
// if column.MaxLength.Int64 == 0 {
// if column.DataType.String == "varchar" {
// strArr = append(strArr, column.DataType.String+"(255)")
// } else {
// strArr = append(strArr, column.DataType.String)
// }
// } else {
// strArr = append(strArr, column.DataType.String+"("+strconv.Itoa(int(column.MaxLength.Int64))+")")
// }
//
// if column.ColumnDefault.String != "" {
// strArr = append(strArr, "DEFAULT '"+column.ColumnDefault.String+"'")
// }
//
// if column.IsNullable.String == "NO" {
// strArr = append(strArr, "NOT NULL")
// }
//
// if column.ColumnComment.String != "" {
// strArr = append(strArr, "COMMENT '"+column.ColumnComment.String+"'")
// }
//
// if column.Extra.String != "" {
// strArr = append(strArr, column.Extra.String)
// }
//
// return strings.Join(strArr, " ")
//}
//
//func getIndexStr(index Index) string {
// var strArr []string
//
// if "PRIMARY" == index.KeyName {
// strArr = append(strArr, index.KeyName)
// strArr = append(strArr, "KEY")
// strArr = append(strArr, "(`"+index.ColumnName+"`)")
// } else {
// if 0 == index.NonUnique {
// strArr = append(strArr, "Unique")
// strArr = append(strArr, index.KeyName)
// strArr = append(strArr, "(`"+index.ColumnName+"`)")
// } else {
// strArr = append(strArr, "Index")
// strArr = append(strArr, index.KeyName)
// strArr = append(strArr, "(`"+index.ColumnName+"`)")
// }
// }
//
// return strings.Join(strArr, " ")
//}
//
////将对象属性类型转换数据库字段数据类型
//func getDataType(fieldType string, fieldMap map[string]string) string {
// var DataType string
//
// dataTypeVal, dataTypeOk := fieldMap["type"]
// if dataTypeOk {
// DataType = dataTypeVal
// } else {
// if "Int" == fieldType {
// DataType = "int"
// }
// if "String" == fieldType {
// DataType = "varchar"
// }
// if "Bool" == fieldType {
// DataType = "tinyint"
// }
// if "Time" == fieldType {
// DataType = "datetime"
// }
// if "Float" == fieldType {
// DataType = "float"
// }
// }
//
// return DataType
//}
//
//func getMaxLength(DataType string, fieldMap map[string]string) int {
// var MaxLength int
//
// maxLengthVal, maxLengthOk := fieldMap["size"]
// if maxLengthOk {
// num, _ := strconv.Atoi(maxLengthVal)
// MaxLength = num
// } else {
// MaxLength = 0
// if "varchar" == DataType {
// MaxLength = 255
// }
// }
//
// return MaxLength
//}
//
//func getNullAble(fieldMap map[string]string) string {
// var IsNullable string
//
// _, primaryOk := fieldMap["primary"]
// if primaryOk {
// IsNullable = "NO"
// } else {
// _, ok := fieldMap["not null"]
// if ok {
// IsNullable = "NO"
// } else {
// IsNullable = "YES"
// }
// }
//
// return IsNullable
//}
//
//func getComment(fieldMap map[string]string) string {
// commentVal, commentIs := fieldMap["comment"]
// if commentIs {
// return commentVal
// }
//
// return ""
//}
//
//func getExtra(fieldMap map[string]string) string {
// _, commentIs := fieldMap["auto_increment"]
// if commentIs {
// return "auto_increment"
// }
//
// return ""
//}
//
//func getDefaultVal(fieldMap map[string]string) string {
// defaultVal, defaultIs := fieldMap["default"]
// if defaultIs {
// return defaultVal
// }
//
// return ""
//}

472
migrate_mysql/migrate.go Normal file
View File

@@ -0,0 +1,472 @@
package migrate_mysql
import (
"github.com/tangpanqing/aorm/executor"
"github.com/tangpanqing/aorm/null"
"reflect"
)
type Table struct {
TableName null.String
Engine null.String
TableComment null.String
}
type Column struct {
ColumnName null.String
ColumnDefault null.String
IsNullable null.String
DataType null.String //数据类型 varchar,bigint,int
MaxLength null.Int //数据最大长度 20
ColumnComment null.String
Extra null.String //扩展信息 auto_increment
}
type Index struct {
NonUnique null.Int
ColumnName null.String
KeyName null.String
}
//MigrateExecutor 定义结构
type MigrateExecutor struct {
ex *executor.Executor
}
//SetEx 设置ex执行者
func (mm *MigrateExecutor) SetEx(ex *executor.Executor) *MigrateExecutor {
mm.ex = ex
return mm
}
//ShowCreateTable 查看创建表的ddl
//func (mm *MigrateExecutor) ShowCreateTable(tableName string) string {
// var str string
// mm.ex.RawSql("show create table "+tableName).Value("Create Table", &str)
// return str
//}
//MigrateCommon 迁移的主要过程
func (mm *MigrateExecutor) MigrateCommon(tableName string, typeOf reflect.Type) error {
//tableFromCode := mm.getTableFromCode(tableName)
//columnsFromCode := mm.getColumnsFromCode(typeOf)
//indexesFromCode := mm.getIndexesFromCode(typeOf, tableFromCode)
//
//dbName, dbErr := mm.getDbName()
//if dbErr != nil {
// return dbErr
//}
//
//tablesFromDb := mm.getTableFromDb(dbName, tableName)
//if len(tablesFromDb) != 0 {
// tableFromDb := tablesFromDb[0]
// columnsFromDb := mm.getColumnsFromDb(dbName, tableName)
// indexsFromDb := mm.getIndexesFromDb(tableName)
//
// mm.modifyTable(tableFromCode, columnsFromCode, indexesFromCode, tableFromDb, columnsFromDb, indexsFromDb)
//} else {
// mm.createTable(tableFromCode, columnsFromCode, indexesFromCode)
//}
return nil
}
//
//func (mm *MigrateExecutor) getTableFromCode(tableName string) Table {
// var tableFromCode Table
// tableFromCode.TableName = aorm.StringFrom(tableName)
// tableFromCode.Engine = aorm.StringFrom(mm.getOpinionVal("ENGINE", "MyISAM"))
// tableFromCode.TableComment = aorm.StringFrom(mm.getOpinionVal("COMMENT", ""))
//
// return tableFromCode
//}
//
//func (mm *MigrateExecutor) getColumnsFromCode(typeOf reflect.Type) []Column {
// var columnsFromCode []Column
// for i := 0; i < typeOf.Elem().NumField(); i++ {
// fieldName := aorm.UnderLine(typeOf.Elem().Field(i).Name)
// fieldType := typeOf.Elem().Field(i).Type.Name()
// fieldMap := getTagMap(typeOf.Elem().Field(i).Tag.Get("aorm"))
// columnsFromCode = append(columnsFromCode, Column{
// ColumnName: aorm.StringFrom(fieldName),
// DataType: aorm.StringFrom(getDataType(fieldType, fieldMap)),
// MaxLength: aorm.IntFrom(int64(getMaxLength(getDataType(fieldType, fieldMap), fieldMap))),
// IsNullable: aorm.StringFrom(getNullAble(fieldMap)),
// ColumnComment: aorm.StringFrom(getComment(fieldMap)),
// Extra: aorm.StringFrom(getExtra(fieldMap)),
// ColumnDefault: aorm.StringFrom(getDefaultVal(fieldMap)),
// })
// }
//
// return columnsFromCode
//}
//
//func (mm *MigrateExecutor) getIndexesFromCode(typeOf reflect.Type, tableFromCode Table) []Index {
// var indexesFromCode []Index
// for i := 0; i < typeOf.Elem().NumField(); i++ {
// fieldName := aorm.UnderLine(typeOf.Elem().Field(i).Name)
// fieldMap := getTagMap(typeOf.Elem().Field(i).Tag.Get("aorm"))
//
// _, primaryIs := fieldMap["primary"]
// if primaryIs {
// indexesFromCode = append(indexesFromCode, Index{
// NonUnique: aorm.IntFrom(0),
// ColumnName: aorm.StringFrom(fieldName),
// KeyName: aorm.StringFrom("PRIMARY"),
// })
// }
//
// _, uniqueIndexIs := fieldMap["unique"]
// if uniqueIndexIs {
// indexesFromCode = append(indexesFromCode, Index{
// NonUnique: aorm.IntFrom(0),
// ColumnName: aorm.StringFrom(fieldName),
// KeyName: aorm.StringFrom("idx_" + tableFromCode.TableName.String + "_" + fieldName),
// })
// }
//
// _, indexIs := fieldMap["index"]
// if indexIs {
// indexesFromCode = append(indexesFromCode, Index{
// NonUnique: aorm.IntFrom(1),
// ColumnName: aorm.StringFrom(fieldName),
// KeyName: aorm.StringFrom("idx_" + tableFromCode.TableName.String + "_" + fieldName),
// })
// }
// }
//
// return indexesFromCode
//}
//
//func (mm *MigrateExecutor) getDbName() (string, error) {
// //获取数据库名称
// var dbName string
// err := mm.ex.RawSql("SELECT DATABASE()").Value("DATABASE()", &dbName)
// if err != nil {
// return "", err
// }
//
// return dbName, nil
//}
//
//func (mm *MigrateExecutor) getTableFromDb(dbName string, tableName string) []Table {
// sql := "SELECT TABLE_NAME,ENGINE,TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA =" + "'" + dbName + "' AND TABLE_NAME =" + "'" + tableName + "'"
// var dataList []Table
// mm.ex.RawSql(sql).GetMany(&dataList)
// for i := 0; i < len(dataList); i++ {
// dataList[i].TableComment = aorm.StringFrom("'" + dataList[i].TableComment.String + "'")
// }
//
// return dataList
//}
//
//func (mm *MigrateExecutor) getColumnsFromDb(dbName string, tableName string) []Column {
// var columnsFromDb []Column
//
// sqlColumn := "SELECT COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH as Max_Length,COLUMN_DEFAULT,COLUMN_COMMENT,EXTRA,IS_NULLABLE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA =" + "'" + dbName + "' AND TABLE_NAME =" + "'" + tableName + "'"
// mm.ex.RawSql(sqlColumn).GetMany(&columnsFromDb)
//
// for j := 0; j < len(columnsFromDb); j++ {
// if columnsFromDb[j].DataType.String == "text" && columnsFromDb[j].MaxLength.Int64 == 65535 {
// columnsFromDb[j].MaxLength = aorm.IntFrom(0)
// }
// }
//
// return columnsFromDb
//}
//
//func (mm *MigrateExecutor) getIndexesFromDb(tableName string) []Index {
// sqlIndex := "SHOW INDEXES FROM " + tableName
//
// var indexsFromDb []Index
// mm.ex.RawSql(sqlIndex).GetMany(&indexsFromDb)
//
// return indexsFromDb
//}
//
//func (mm *MigrateExecutor) modifyTable(tableFromCode Table, columnsFromCode []Column, indexesFromCode []Index, tableFromDb Table, columnsFromDb []Column, indexsFromDb []Index) {
// if tableFromCode.Engine != tableFromDb.Engine {
// mm.modifyTableEngine(tableFromCode)
// }
//
// if tableFromCode.TableComment != tableFromDb.TableComment {
// mm.modifyTableComment(tableFromCode)
// }
//
// for i := 0; i < len(columnsFromCode); i++ {
// isFind := 0
// columnCode := columnsFromCode[i]
//
// for j := 0; j < len(columnsFromDb); j++ {
// columnDb := columnsFromDb[j]
// if columnCode.ColumnName == columnDb.ColumnName {
// isFind = 1
// if columnCode.DataType.String != columnDb.DataType.String ||
// columnCode.MaxLength.Int64 != columnDb.MaxLength.Int64 ||
// columnCode.ColumnComment.String != columnDb.ColumnComment.String ||
// columnCode.Extra.String != columnDb.Extra.String ||
// columnCode.ColumnDefault.String != columnDb.ColumnDefault.String {
// sql := "ALTER TABLE " + tableFromCode.TableName.String + " MODIFY " + getColumnStr(columnCode)
// _, err := mm.ex.Exec(sql)
// if err != nil {
// fmt.Println(err)
// } else {
// fmt.Println("修改属性:" + sql)
// }
// }
// }
// }
//
// if isFind == 0 {
// sql := "ALTER TABLE " + tableFromCode.TableName.String + " ADD " + getColumnStr(columnCode)
// _, err := mm.ex.Exec(sql)
// if err != nil {
// fmt.Println(err)
// } else {
// fmt.Println("增加属性:" + sql)
// }
// }
// }
//
// for i := 0; i < len(indexesFromCode); i++ {
// isFind := 0
// indexCode := indexesFromCode[i]
//
// for j := 0; j < len(indexsFromDb); j++ {
// indexDb := indexsFromDb[j]
// if indexCode.ColumnName == indexDb.ColumnName {
// isFind = 1
// if indexCode.KeyName != indexDb.KeyName || indexCode.NonUnique != indexDb.NonUnique {
// sql := "ALTER TABLE " + tableFromCode.TableName.String + " MODIFY " + getIndexStr(indexCode)
// _, err := mm.ex.Exec(sql)
// if err != nil {
// fmt.Println(err)
// } else {
// fmt.Println("修改索引:" + sql)
// }
// }
// }
// }
//
// if isFind == 0 {
// sql := "ALTER TABLE " + tableFromCode.TableName.String + " ADD " + getIndexStr(indexCode)
// _, err := mm.ex.Exec(sql)
// if err != nil {
// fmt.Println(err)
// } else {
// fmt.Println("增加索引:" + sql)
// }
// }
// }
//}
//
//func (mm *MigrateExecutor) modifyTableEngine(tableFromCode Table) {
// sql := "ALTER TABLE " + tableFromCode.TableName.String + " Engine " + tableFromCode.Engine.String
// _, err := mm.ex.Exec(sql)
// if err != nil {
// fmt.Println(err)
// } else {
// fmt.Println("修改表:" + sql)
// }
//}
//
//func (mm *MigrateExecutor) modifyTableComment(tableFromCode Table) {
// sql := "ALTER TABLE " + tableFromCode.TableName.String + " Comment " + tableFromCode.TableComment.String
// _, err := mm.ex.Exec(sql)
// if err != nil {
// fmt.Println(err)
// } else {
// fmt.Println("修改表:" + sql)
// }
//}
//
//func (mm *MigrateExecutor) createTable(tableFromCode Table, columnsFromCode []Column, indexesFromCode []Index) {
// var fieldArr []string
//
// for i := 0; i < len(columnsFromCode); i++ {
// column := columnsFromCode[i]
// fieldArr = append(fieldArr, getColumnStr(column))
// }
//
// for i := 0; i < len(indexesFromCode); i++ {
// index := indexesFromCode[i]
// 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 + ";"
// _, err := mm.ex.Exec(sqlStr)
// if err != nil {
// fmt.Println(err)
// } else {
// fmt.Println("创建表:" + tableFromCode.TableName.String)
// }
//}
//
//func (mm *MigrateExecutor) getOpinionVal(key string, def string) string {
// opinions := mm.ex.GetOpinionList()
// for i := 0; i < len(opinions); i++ {
// opinionItem := opinions[i]
// if opinionItem.Key == key {
// def = opinionItem.Val
// }
// }
// return def
//}
//
//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
//}
//
//func getColumnStr(column Column) string {
// var strArr []string
// strArr = append(strArr, column.ColumnName.String)
// if column.MaxLength.Int64 == 0 {
// if column.DataType.String == "varchar" {
// strArr = append(strArr, column.DataType.String+"(255)")
// } else {
// strArr = append(strArr, column.DataType.String)
// }
// } else {
// strArr = append(strArr, column.DataType.String+"("+strconv.Itoa(int(column.MaxLength.Int64))+")")
// }
//
// if column.ColumnDefault.String != "" {
// strArr = append(strArr, "DEFAULT '"+column.ColumnDefault.String+"'")
// }
//
// if column.IsNullable.String == "NO" {
// strArr = append(strArr, "NOT NULL")
// }
//
// if column.ColumnComment.String != "" {
// strArr = append(strArr, "COMMENT '"+column.ColumnComment.String+"'")
// }
//
// if column.Extra.String != "" {
// strArr = append(strArr, column.Extra.String)
// }
//
// return strings.Join(strArr, " ")
//}
//
//func getIndexStr(index Index) string {
// var strArr []string
//
// if "PRIMARY" == index.KeyName.String {
// strArr = append(strArr, index.KeyName.String)
// strArr = append(strArr, "KEY")
// strArr = append(strArr, "(`"+index.ColumnName.String+"`)")
// } else {
// if 0 == index.NonUnique.Int64 {
// strArr = append(strArr, "Unique")
// strArr = append(strArr, index.KeyName.String)
// strArr = append(strArr, "(`"+index.ColumnName.String+"`)")
// } else {
// strArr = append(strArr, "Index")
// strArr = append(strArr, index.KeyName.String)
// strArr = append(strArr, "(`"+index.ColumnName.String+"`)")
// }
// }
//
// return strings.Join(strArr, " ")
//}
//
//func getDataType(fieldType string, fieldMap map[string]string) string {
// var DataType string
//
// dataTypeVal, dataTypeOk := fieldMap["type"]
// if dataTypeOk {
// DataType = dataTypeVal
// } else {
// if "Int" == fieldType {
// DataType = "int"
// }
// if "String" == fieldType {
// DataType = "varchar"
// }
// if "Bool" == fieldType {
// DataType = "tinyint"
// }
// if "Time" == fieldType {
// DataType = "datetime"
// }
// if "Float" == fieldType {
// DataType = "float"
// }
// }
//
// return DataType
//}
//
//func getMaxLength(DataType string, fieldMap map[string]string) int {
// var MaxLength int
//
// maxLengthVal, maxLengthOk := fieldMap["size"]
// if maxLengthOk {
// num, _ := strconv.Atoi(maxLengthVal)
// MaxLength = num
// } else {
// MaxLength = 0
// if "varchar" == DataType {
// MaxLength = 255
// }
// }
//
// return MaxLength
//}
//
//func getNullAble(fieldMap map[string]string) string {
// var IsNullable string
//
// _, primaryOk := fieldMap["primary"]
// if primaryOk {
// IsNullable = "NO"
// } else {
// _, ok := fieldMap["not null"]
// if ok {
// IsNullable = "NO"
// } else {
// IsNullable = "YES"
// }
// }
//
// return IsNullable
//}
//
//func getComment(fieldMap map[string]string) string {
// commentVal, commentIs := fieldMap["comment"]
// if commentIs {
// return commentVal
// }
//
// return ""
//}
//
//func getExtra(fieldMap map[string]string) string {
// _, commentIs := fieldMap["auto_increment"]
// if commentIs {
// return "auto_increment"
// }
//
// return ""
//}
//
//func getDefaultVal(fieldMap map[string]string) string {
// defaultVal, defaultIs := fieldMap["default"]
// if defaultIs {
// return defaultVal
// }
//
// return ""
//}

View File

@@ -1,4 +1,4 @@
package aorm package null
import ( import (
"bytes" "bytes"

View File

@@ -5,100 +5,125 @@ import (
_ "github.com/go-sql-driver/mysql" _ "github.com/go-sql-driver/mysql"
_ "github.com/mattn/go-sqlite3" _ "github.com/mattn/go-sqlite3"
"github.com/tangpanqing/aorm" "github.com/tangpanqing/aorm"
"github.com/tangpanqing/aorm/executor"
"github.com/tangpanqing/aorm/null"
"testing" "testing"
"time" "time"
) )
type Article struct { type Article struct {
Id aorm.Int `aorm:"primary;auto_increment;type:bigint" json:"id"` Id null.Int `aorm:"primary;auto_increment;type:bigint" json:"id"`
Type aorm.Int `aorm:"index;comment:类型" json:"type"` Type null.Int `aorm:"index;comment:类型" json:"type"`
PersonId aorm.Int `aorm:"comment:人员Id" json:"personId"` PersonId null.Int `aorm:"comment:人员Id" json:"personId"`
ArticleBody aorm.String `aorm:"type:text;comment:文章内容" json:"articleBody"` ArticleBody null.String `aorm:"type:text;comment:文章内容" json:"articleBody"`
} }
type ArticleVO struct { type ArticleVO struct {
Id aorm.Int `aorm:"primary;auto_increment;type:bigint" json:"id"` Id null.Int `aorm:"primary;auto_increment;type:bigint" json:"id"`
Type aorm.Int `aorm:"index;comment:类型" json:"type"` Type null.Int `aorm:"index;comment:类型" json:"type"`
PersonId aorm.Int `aorm:"comment:人员Id" json:"personId"` PersonId null.Int `aorm:"comment:人员Id" json:"personId"`
PersonName aorm.String `aorm:"comment:人员名称" json:"personName"` PersonName null.String `aorm:"comment:人员名称" json:"personName"`
ArticleBody aorm.String `aorm:"type:text;comment:文章内容" json:"articleBody"` ArticleBody null.String `aorm:"type:text;comment:文章内容" json:"articleBody"`
} }
type Person struct { type Person struct {
Id aorm.Int `aorm:"primary;auto_increment" json:"id"` Id null.Int `aorm:"primary;auto_increment" json:"id"`
Name aorm.String `aorm:"size:100;not null;comment:名字" json:"name"` Name null.String `aorm:"size:100;not null;comment:名字" json:"name"`
Sex aorm.Bool `aorm:"index;comment:性别" json:"sex"` Sex null.Bool `aorm:"index;comment:性别" json:"sex"`
Age aorm.Int `aorm:"index;comment:年龄" json:"age"` Age null.Int `aorm:"index;comment:年龄" json:"age"`
Type aorm.Int `aorm:"index;comment:类型" json:"type"` Type null.Int `aorm:"index;comment:类型" json:"type"`
CreateTime aorm.Time `aorm:"comment:创建时间" json:"createTime"` CreateTime null.Time `aorm:"comment:创建时间" json:"createTime"`
Money aorm.Float `aorm:"comment:金额" json:"money"` Money null.Float `aorm:"comment:金额" json:"money"`
Test aorm.Float `aorm:"type:double;comment:测试" json:"test"` Test null.Float `aorm:"type:double;comment:测试" json:"test"`
} }
type PersonAge struct { type PersonAge struct {
Age aorm.Int Age null.Int
AgeCount aorm.Int AgeCount null.Int
} }
type PersonWithArticleCount struct { type PersonWithArticleCount struct {
Id aorm.Int `aorm:"primary;auto_increment" json:"id"` Id null.Int `aorm:"primary;auto_increment" json:"id"`
Name aorm.String `aorm:"size:100;not null;comment:名字" json:"name"` Name null.String `aorm:"size:100;not null;comment:名字" json:"name"`
Sex aorm.Bool `aorm:"index;comment:性别" json:"sex"` Sex null.Bool `aorm:"index;comment:性别" json:"sex"`
Age aorm.Int `aorm:"index;comment:年龄" json:"age"` Age null.Int `aorm:"index;comment:年龄" json:"age"`
Type aorm.Int `aorm:"index;comment:类型" json:"type"` Type null.Int `aorm:"index;comment:类型" json:"type"`
CreateTime aorm.Time `aorm:"comment:创建时间" json:"createTime"` CreateTime null.Time `aorm:"comment:创建时间" json:"createTime"`
Money aorm.Float `aorm:"comment:金额" json:"money"` Money null.Float `aorm:"comment:金额" json:"money"`
Test aorm.Float `aorm:"type:double;comment:测试" json:"test"` Test null.Float `aorm:"type:double;comment:测试" json:"test"`
ArticleCount aorm.Int `aorm:"comment:文章数量" json:"articleCount"` ArticleCount null.Int `aorm:"comment:文章数量" json:"articleCount"`
} }
func TestAll(t *testing.T) { func TestAll(t *testing.T) {
name := "mysql" sqlite3Content, sqlite3Err := aorm.Open("sqlite3", "test.db")
db := testMysqlConnect() if sqlite3Err != nil {
panic(sqlite3Err)
}
testMigrate(name, db) //username := "root"
//password := "root"
//hostname := "localhost"
//port := "3306"
//dbname := "database_name"
//
//mysqlContent, mysqlErr := aorm.Open("mysql", username+":"+password+"@tcp("+hostname+":"+port+")/"+dbname+"?charset=utf8mb4&parseTime=True&loc=Local")
//if mysqlErr != nil {
// panic(mysqlErr)
//}
testShowCreateTable(name, db) dbList := make([]aorm.DbContent, 0)
dbList = append(dbList, sqlite3Content)
//dbList = append(dbList, mysqlContent)
id := testInsert(name, db) for i := 0; i < len(dbList); i++ {
testInsertBatch(name, db) dbItem := dbList[i]
testGetOne(name, db, id) testMigrate(dbItem.DriverName, dbItem.DbLink)
testGetMany(name, db) break
testUpdate(name, db, id)
testDelete(name, db, id)
id2 := testInsert(name, db) testShowCreateTable(dbItem.DriverName, dbItem.DbLink)
testTable(name, db)
testSelect(name, db)
testSelectWithSub(name, db)
testWhereWithSub(name, db)
testWhere(name, db)
testJoin(name, db)
testGroupBy(name, db)
testHaving(name, db)
testOrderBy(name, db)
testLimit(name, db)
testLock(name, db, id2)
testIncrement(name, db, id2) id := testInsert(dbItem.DriverName, dbItem.DbLink)
testDecrement(name, db, id2) testInsertBatch(dbItem.DriverName, dbItem.DbLink)
testValue(name, db, id2) testGetOne(dbItem.DriverName, dbItem.DbLink, id)
testGetMany(dbItem.DriverName, dbItem.DbLink)
testUpdate(dbItem.DriverName, dbItem.DbLink, id)
testDelete(dbItem.DriverName, dbItem.DbLink, id)
testPluck(name, db) id2 := testInsert(dbItem.DriverName, dbItem.DbLink)
testTable(dbItem.DriverName, dbItem.DbLink)
testSelect(dbItem.DriverName, dbItem.DbLink)
testSelectWithSub(dbItem.DriverName, dbItem.DbLink)
testWhereWithSub(dbItem.DriverName, dbItem.DbLink)
testWhere(dbItem.DriverName, dbItem.DbLink)
testJoin(dbItem.DriverName, dbItem.DbLink)
testGroupBy(dbItem.DriverName, dbItem.DbLink)
testHaving(dbItem.DriverName, dbItem.DbLink)
testOrderBy(dbItem.DriverName, dbItem.DbLink)
testLimit(dbItem.DriverName, dbItem.DbLink)
testLock(dbItem.DriverName, dbItem.DbLink, id2)
testCount(name, db) testIncrement(dbItem.DriverName, dbItem.DbLink, id2)
testSum(name, db) testDecrement(dbItem.DriverName, dbItem.DbLink, id2)
testAvg(name, db)
testMin(name, db)
testMax(name, db)
testExec(name, db) testValue(dbItem.DriverName, dbItem.DbLink, id2)
testPluck(dbItem.DriverName, dbItem.DbLink)
testCount(dbItem.DriverName, dbItem.DbLink)
testSum(dbItem.DriverName, dbItem.DbLink)
testAvg(dbItem.DriverName, dbItem.DbLink)
testMin(dbItem.DriverName, dbItem.DbLink)
testMax(dbItem.DriverName, dbItem.DbLink)
testExec(dbItem.DriverName, dbItem.DbLink)
testTransaction(dbItem.DriverName, dbItem.DbLink)
testTruncate(dbItem.DriverName, dbItem.DbLink)
testHelper(dbItem.DriverName, dbItem.DbLink)
}
testTransaction(name, db)
testTruncate(name, db)
testHelper(name, db)
// //
//for _, db := range dbMap { //for _, db := range dbMap {
// db.Close() // db.Close()
@@ -131,36 +156,36 @@ func testMysqlConnect() *sql.DB {
func testMigrate(name string, db *sql.DB) { func testMigrate(name string, db *sql.DB) {
//AutoMigrate //AutoMigrate
aorm.Use(db).Opinion("ENGINE", "InnoDB").Opinion("COMMENT", "人员表").AutoMigrate(&Person{}) aorm.Use(db).Driver(name).Opinion("ENGINE", "InnoDB").Opinion("COMMENT", "人员表").AutoMigrate(&Person{})
aorm.Use(db).Opinion("ENGINE", "InnoDB").Opinion("COMMENT", "文章").AutoMigrate(&Article{}) aorm.Use(db).Driver(name).Opinion("ENGINE", "InnoDB").Opinion("COMMENT", "文章").AutoMigrate(&Article{})
//Migrate //Migrate
aorm.Use(db).Opinion("ENGINE", "InnoDB").Opinion("COMMENT", "人员表").Migrate("person_1", &Person{}) aorm.Use(db).Driver(name).Opinion("ENGINE", "InnoDB").Opinion("COMMENT", "人员表").Migrate("person_1", &Person{})
} }
func testShowCreateTable(name string, db *sql.DB) { func testShowCreateTable(name string, db *sql.DB) {
aorm.Use(db).ShowCreateTable("person") aorm.Use(db).Driver(name).ShowCreateTable("person")
} }
func testInsert(name string, db *sql.DB) int64 { func testInsert(name string, db *sql.DB) int64 {
id, errInsert := aorm.Use(db).Debug(false).Insert(&Person{ id, errInsert := aorm.Use(db).Debug(false).Insert(&Person{
Name: aorm.StringFrom("Alice"), Name: null.StringFrom("Alice"),
Sex: aorm.BoolFrom(false), Sex: null.BoolFrom(false),
Age: aorm.IntFrom(18), Age: null.IntFrom(18),
Type: aorm.IntFrom(0), Type: null.IntFrom(0),
CreateTime: aorm.TimeFrom(time.Now()), CreateTime: null.TimeFrom(time.Now()),
Money: aorm.FloatFrom(100.15987654321), Money: null.FloatFrom(100.15987654321),
Test: aorm.FloatFrom(200.15987654321987654321), Test: null.FloatFrom(200.15987654321987654321),
}) })
if errInsert != nil { if errInsert != nil {
panic(name + "testInsert" + "found err") panic(name + "testInsert" + "found err")
} }
aorm.Use(db).Debug(false).Insert(&Article{ aorm.Use(db).Debug(false).Insert(&Article{
Type: aorm.IntFrom(0), Type: null.IntFrom(0),
PersonId: aorm.IntFrom(id), PersonId: null.IntFrom(id),
ArticleBody: aorm.StringFrom("文章内容"), ArticleBody: null.StringFrom("文章内容"),
}) })
return id return id
@@ -169,23 +194,23 @@ func testInsert(name string, db *sql.DB) int64 {
func testInsertBatch(name string, db *sql.DB) int64 { func testInsertBatch(name string, db *sql.DB) int64 {
var batch []Person var batch []Person
batch = append(batch, Person{ batch = append(batch, Person{
Name: aorm.StringFrom("Alice"), Name: null.StringFrom("Alice"),
Sex: aorm.BoolFrom(false), Sex: null.BoolFrom(false),
Age: aorm.IntFrom(18), Age: null.IntFrom(18),
Type: aorm.IntFrom(0), Type: null.IntFrom(0),
CreateTime: aorm.TimeFrom(time.Now()), CreateTime: null.TimeFrom(time.Now()),
Money: aorm.FloatFrom(100.15987654321), Money: null.FloatFrom(100.15987654321),
Test: aorm.FloatFrom(200.15987654321987654321), Test: null.FloatFrom(200.15987654321987654321),
}) })
batch = append(batch, Person{ batch = append(batch, Person{
Name: aorm.StringFrom("Bob"), Name: null.StringFrom("Bob"),
Sex: aorm.BoolFrom(true), Sex: null.BoolFrom(true),
Age: aorm.IntFrom(18), Age: null.IntFrom(18),
Type: aorm.IntFrom(0), Type: null.IntFrom(0),
CreateTime: aorm.TimeFrom(time.Now()), CreateTime: null.TimeFrom(time.Now()),
Money: aorm.FloatFrom(100.15987654321), Money: null.FloatFrom(100.15987654321),
Test: aorm.FloatFrom(200.15987654321987654321), Test: null.FloatFrom(200.15987654321987654321),
}) })
count, err := aorm.Use(db).Debug(false).InsertBatch(&batch) count, err := aorm.Use(db).Debug(false).InsertBatch(&batch)
@@ -198,7 +223,7 @@ func testInsertBatch(name string, db *sql.DB) int64 {
func testGetOne(name string, db *sql.DB, id int64) { func testGetOne(name string, db *sql.DB, id int64) {
var person Person var person Person
errFind := aorm.Use(db).Debug(false).Where(&Person{Id: aorm.IntFrom(id)}).GetOne(&person) errFind := aorm.Use(db).Debug(false).Where(&Person{Id: null.IntFrom(id)}).GetOne(&person)
if errFind != nil { if errFind != nil {
panic(name + "testGetOne" + "found err") panic(name + "testGetOne" + "found err")
} }
@@ -206,28 +231,28 @@ func testGetOne(name string, db *sql.DB, id int64) {
func testGetMany(name string, db *sql.DB) { func testGetMany(name string, db *sql.DB) {
var list []Person var list []Person
errSelect := aorm.Use(db).Debug(false).Where(&Person{Type: aorm.IntFrom(0)}).GetMany(&list) errSelect := aorm.Use(db).Debug(false).Where(&Person{Type: null.IntFrom(0)}).GetMany(&list)
if errSelect != nil { if errSelect != nil {
panic(name + " testGetMany " + "found err:" + errSelect.Error()) panic(name + " testGetMany " + "found err:" + errSelect.Error())
} }
} }
func testUpdate(name string, db *sql.DB, id int64) { func testUpdate(name string, db *sql.DB, id int64) {
_, errUpdate := aorm.Use(db).Debug(false).Where(&Person{Id: aorm.IntFrom(id)}).Update(&Person{Name: aorm.StringFrom("Bob")}) _, errUpdate := aorm.Use(db).Debug(false).Where(&Person{Id: null.IntFrom(id)}).Update(&Person{Name: null.StringFrom("Bob")})
if errUpdate != nil { if errUpdate != nil {
panic(name + "testGetMany" + "found err") panic(name + "testGetMany" + "found err")
} }
} }
func testDelete(name string, db *sql.DB, id int64) { func testDelete(name string, db *sql.DB, id int64) {
_, errDelete := aorm.Use(db).Debug(false).Where(&Person{Id: aorm.IntFrom(id)}).Delete() _, errDelete := aorm.Use(db).Debug(false).Where(&Person{Id: null.IntFrom(id)}).Delete()
if errDelete != nil { if errDelete != nil {
panic(name + "testDelete" + "found err") panic(name + "testDelete" + "found err")
} }
} }
func testTable(name string, db *sql.DB) { func testTable(name string, db *sql.DB) {
_, err := aorm.Use(db).Debug(false).Table("person_1").Insert(&Person{Name: aorm.StringFrom("Cherry")}) _, err := aorm.Use(db).Debug(false).Table("person_1").Insert(&Person{Name: null.StringFrom("Cherry")})
if err != nil { if err != nil {
panic(name + "testTable" + "found err") panic(name + "testTable" + "found err")
} }
@@ -235,7 +260,7 @@ func testTable(name string, db *sql.DB) {
func testSelect(name string, db *sql.DB) { func testSelect(name string, db *sql.DB) {
var listByFiled []Person var listByFiled []Person
err := aorm.Use(db).Debug(false).Select("name,age").Where(&Person{Age: aorm.IntFrom(18)}).GetMany(&listByFiled) err := aorm.Use(db).Debug(false).Select("name,age").Where(&Person{Age: null.IntFrom(18)}).GetMany(&listByFiled)
if err != nil { if err != nil {
panic(name + " testSelect " + "found err:" + err.Error()) panic(name + " testSelect " + "found err:" + err.Error())
} }
@@ -248,7 +273,7 @@ func testSelectWithSub(name string, db *sql.DB) {
err := aorm.Use(db).Debug(false). err := aorm.Use(db).Debug(false).
SelectExp(&sub, "article_count"). SelectExp(&sub, "article_count").
Select("*"). Select("*").
Where(&Person{Age: aorm.IntFrom(18)}). Where(&Person{Age: null.IntFrom(18)}).
GetMany(&listByFiled) GetMany(&listByFiled)
if err != nil { if err != nil {
@@ -274,12 +299,12 @@ func testWhereWithSub(name string, db *sql.DB) {
func testWhere(name string, db *sql.DB) { func testWhere(name string, db *sql.DB) {
var listByWhere []Person var listByWhere []Person
var where1 []aorm.WhereItem var where1 []executor.WhereItem
where1 = append(where1, aorm.WhereItem{Field: "type", Opt: aorm.Eq, Val: 0}) where1 = append(where1, executor.WhereItem{Field: "type", Opt: executor.Eq, Val: 0})
where1 = append(where1, aorm.WhereItem{Field: "age", Opt: aorm.In, Val: []int{18, 20}}) where1 = append(where1, executor.WhereItem{Field: "age", Opt: executor.In, Val: []int{18, 20}})
where1 = append(where1, aorm.WhereItem{Field: "money", Opt: aorm.Between, Val: []float64{100.1, 200.9}}) where1 = append(where1, executor.WhereItem{Field: "money", Opt: executor.Between, Val: []float64{100.1, 200.9}})
where1 = append(where1, aorm.WhereItem{Field: "money", Opt: aorm.Eq, Val: 100.15}) where1 = append(where1, executor.WhereItem{Field: "money", Opt: executor.Eq, Val: 100.15})
where1 = append(where1, aorm.WhereItem{Field: "name", Opt: aorm.Like, Val: []string{"%", "li", "%"}}) where1 = append(where1, executor.WhereItem{Field: "name", Opt: executor.Like, Val: []string{"%", "li", "%"}})
err := aorm.Use(db).Debug(false).Table("person").WhereArr(where1).GetMany(&listByWhere) err := aorm.Use(db).Debug(false).Table("person").WhereArr(where1).GetMany(&listByWhere)
if err != nil { if err != nil {
@@ -289,9 +314,9 @@ func testWhere(name string, db *sql.DB) {
func testJoin(name string, db *sql.DB) { func testJoin(name string, db *sql.DB) {
var list2 []ArticleVO var list2 []ArticleVO
var where2 []aorm.WhereItem var where2 []executor.WhereItem
where2 = append(where2, aorm.WhereItem{Field: "o.type", Opt: aorm.Eq, Val: 0}) where2 = append(where2, executor.WhereItem{Field: "o.type", Opt: executor.Eq, Val: 0})
where2 = append(where2, aorm.WhereItem{Field: "p.age", Opt: aorm.In, Val: []int{18, 20}}) where2 = append(where2, executor.WhereItem{Field: "p.age", Opt: executor.In, Val: []int{18, 20}})
err := aorm.Use(db).Debug(false). err := aorm.Use(db).Debug(false).
Table("article o"). Table("article o").
LeftJoin("person p", "p.id=o.person_id"). LeftJoin("person p", "p.id=o.person_id").
@@ -306,8 +331,8 @@ func testJoin(name string, db *sql.DB) {
func testGroupBy(name string, db *sql.DB) { func testGroupBy(name string, db *sql.DB) {
var personAge PersonAge var personAge PersonAge
var where []aorm.WhereItem var where []executor.WhereItem
where = append(where, aorm.WhereItem{Field: "type", Opt: aorm.Eq, Val: 0}) where = append(where, executor.WhereItem{Field: "type", Opt: executor.Eq, Val: 0})
err := aorm.Use(db).Debug(false). err := aorm.Use(db).Debug(false).
Table("person"). Table("person").
Select("age"). Select("age").
@@ -323,11 +348,11 @@ func testGroupBy(name string, db *sql.DB) {
func testHaving(name string, db *sql.DB) { func testHaving(name string, db *sql.DB) {
var listByHaving []PersonAge var listByHaving []PersonAge
var where3 []aorm.WhereItem var where3 []executor.WhereItem
where3 = append(where3, aorm.WhereItem{Field: "type", Opt: aorm.Eq, Val: 0}) where3 = append(where3, executor.WhereItem{Field: "type", Opt: executor.Eq, Val: 0})
var having []aorm.WhereItem var having []executor.WhereItem
having = append(having, aorm.WhereItem{Field: "age_count", Opt: aorm.Gt, Val: 4}) having = append(having, executor.WhereItem{Field: "age_count", Opt: executor.Gt, Val: 4})
err := aorm.Use(db).Debug(false). err := aorm.Use(db).Debug(false).
Table("person"). Table("person").
@@ -344,12 +369,12 @@ func testHaving(name string, db *sql.DB) {
func testOrderBy(name string, db *sql.DB) { func testOrderBy(name string, db *sql.DB) {
var listByOrder []Person var listByOrder []Person
var where []aorm.WhereItem var where []executor.WhereItem
where = append(where, aorm.WhereItem{Field: "type", Opt: aorm.Eq, Val: 0}) where = append(where, executor.WhereItem{Field: "type", Opt: executor.Eq, Val: 0})
err := aorm.Use(db).Debug(false). err := aorm.Use(db).Debug(false).
Table("person"). Table("person").
WhereArr(where). WhereArr(where).
OrderBy("age", aorm.Desc). OrderBy("age", executor.Desc).
GetMany(&listByOrder) GetMany(&listByOrder)
if err != nil { if err != nil {
panic(name + "testOrderBy" + "found err") panic(name + "testOrderBy" + "found err")
@@ -358,8 +383,8 @@ func testOrderBy(name string, db *sql.DB) {
func testLimit(name string, db *sql.DB) { func testLimit(name string, db *sql.DB) {
var list3 []Person var list3 []Person
var where1 []aorm.WhereItem var where1 []executor.WhereItem
where1 = append(where1, aorm.WhereItem{Field: "type", Opt: aorm.Eq, Val: 0}) where1 = append(where1, executor.WhereItem{Field: "type", Opt: executor.Eq, Val: 0})
err1 := aorm.Use(db).Debug(false). err1 := aorm.Use(db).Debug(false).
Table("person"). Table("person").
WhereArr(where1). WhereArr(where1).
@@ -370,8 +395,8 @@ func testLimit(name string, db *sql.DB) {
} }
var list4 []Person var list4 []Person
var where2 []aorm.WhereItem var where2 []executor.WhereItem
where2 = append(where2, aorm.WhereItem{Field: "type", Opt: aorm.Eq, Val: 0}) where2 = append(where2, executor.WhereItem{Field: "type", Opt: executor.Eq, Val: 0})
err := aorm.Use(db).Debug(false). err := aorm.Use(db).Debug(false).
Table("person"). Table("person").
WhereArr(where2). WhereArr(where2).
@@ -385,21 +410,21 @@ func testLimit(name string, db *sql.DB) {
func testLock(name string, db *sql.DB, id int64) { func testLock(name string, db *sql.DB, id int64) {
var itemByLock Person var itemByLock Person
err := aorm.Use(db).Debug(false).LockForUpdate(true).Where(&Person{Id: aorm.IntFrom(id)}).GetOne(&itemByLock) err := aorm.Use(db).Debug(false).LockForUpdate(true).Where(&Person{Id: null.IntFrom(id)}).GetOne(&itemByLock)
if err != nil { if err != nil {
panic(name + "testLock" + "found err") panic(name + "testLock" + "found err")
} }
} }
func testIncrement(name string, db *sql.DB, id int64) { func testIncrement(name string, db *sql.DB, id int64) {
_, err := aorm.Use(db).Debug(false).Where(&Person{Id: aorm.IntFrom(id)}).Increment("age", 1) _, err := aorm.Use(db).Debug(false).Where(&Person{Id: null.IntFrom(id)}).Increment("age", 1)
if err != nil { if err != nil {
panic(name + "testIncrement" + "found err") panic(name + "testIncrement" + "found err")
} }
} }
func testDecrement(name string, db *sql.DB, id int64) { func testDecrement(name string, db *sql.DB, id int64) {
_, err := aorm.Use(db).Debug(false).Where(&Person{Id: aorm.IntFrom(id)}).Decrement("age", 2) _, err := aorm.Use(db).Debug(false).Where(&Person{Id: null.IntFrom(id)}).Decrement("age", 2)
if err != nil { if err != nil {
panic(name + "testDecrement" + "found err") panic(name + "testDecrement" + "found err")
} }
@@ -408,25 +433,25 @@ func testDecrement(name string, db *sql.DB, id int64) {
func testValue(dbName string, db *sql.DB, id int64) { func testValue(dbName string, db *sql.DB, id int64) {
var name string var name string
errName := aorm.Use(db).Debug(false).Where(&Person{Id: aorm.IntFrom(id)}).Value("name", &name) errName := aorm.Use(db).Debug(false).Where(&Person{Id: null.IntFrom(id)}).Value("name", &name)
if errName != nil { if errName != nil {
panic(dbName + "testValue" + "found err") panic(dbName + "testValue" + "found err")
} }
var age int64 var age int64
errAge := aorm.Use(db).Debug(false).Where(&Person{Id: aorm.IntFrom(id)}).Value("age", &age) errAge := aorm.Use(db).Debug(false).Where(&Person{Id: null.IntFrom(id)}).Value("age", &age)
if errAge != nil { if errAge != nil {
panic(dbName + "testValue" + "found err") panic(dbName + "testValue" + "found err")
} }
var money float32 var money float32
errMoney := aorm.Use(db).Debug(false).Where(&Person{Id: aorm.IntFrom(id)}).Value("money", &money) errMoney := aorm.Use(db).Debug(false).Where(&Person{Id: null.IntFrom(id)}).Value("money", &money)
if errMoney != nil { if errMoney != nil {
panic(dbName + "testValue" + "found err") panic(dbName + "testValue" + "found err")
} }
var test float64 var test float64
errTest := aorm.Use(db).Debug(false).Where(&Person{Id: aorm.IntFrom(id)}).Value("test", &test) errTest := aorm.Use(db).Debug(false).Where(&Person{Id: null.IntFrom(id)}).Value("test", &test)
if errTest != nil { if errTest != nil {
panic(dbName + "testValue" + "found err") panic(dbName + "testValue" + "found err")
} }
@@ -435,60 +460,60 @@ func testValue(dbName string, db *sql.DB, id int64) {
func testPluck(name string, db *sql.DB) { func testPluck(name string, db *sql.DB) {
var nameList []string var nameList []string
errNameList := aorm.Use(db).Debug(false).Where(&Person{Type: aorm.IntFrom(0)}).Limit(0, 3).Pluck("name", &nameList) errNameList := aorm.Use(db).Debug(false).Where(&Person{Type: null.IntFrom(0)}).Limit(0, 3).Pluck("name", &nameList)
if errNameList != nil { if errNameList != nil {
panic(name + "testPluck" + "found err") panic(name + "testPluck" + "found err")
} }
var ageList []int64 var ageList []int64
errAgeList := aorm.Use(db).Debug(false).Where(&Person{Type: aorm.IntFrom(0)}).Limit(0, 3).Pluck("age", &ageList) errAgeList := aorm.Use(db).Debug(false).Where(&Person{Type: null.IntFrom(0)}).Limit(0, 3).Pluck("age", &ageList)
if errAgeList != nil { if errAgeList != nil {
panic(name + "testPluck" + "found err:" + errAgeList.Error()) panic(name + "testPluck" + "found err:" + errAgeList.Error())
} }
var moneyList []float32 var moneyList []float32
errMoneyList := aorm.Use(db).Debug(false).Where(&Person{Type: aorm.IntFrom(0)}).Limit(0, 3).Pluck("money", &moneyList) errMoneyList := aorm.Use(db).Debug(false).Where(&Person{Type: null.IntFrom(0)}).Limit(0, 3).Pluck("money", &moneyList)
if errMoneyList != nil { if errMoneyList != nil {
panic(name + "testPluck" + "found err") panic(name + "testPluck" + "found err")
} }
var testList []float64 var testList []float64
errTestList := aorm.Use(db).Debug(false).Where(&Person{Type: aorm.IntFrom(0)}).Limit(0, 3).Pluck("test", &testList) errTestList := aorm.Use(db).Debug(false).Where(&Person{Type: null.IntFrom(0)}).Limit(0, 3).Pluck("test", &testList)
if errTestList != nil { if errTestList != nil {
panic(name + "testPluck" + "found err") panic(name + "testPluck" + "found err")
} }
} }
func testCount(name string, db *sql.DB) { func testCount(name string, db *sql.DB) {
_, err := aorm.Use(db).Debug(false).Where(&Person{Age: aorm.IntFrom(18)}).Count("*") _, err := aorm.Use(db).Debug(false).Where(&Person{Age: null.IntFrom(18)}).Count("*")
if err != nil { if err != nil {
panic(name + "testCount" + "found err") panic(name + "testCount" + "found err")
} }
} }
func testSum(name string, db *sql.DB) { func testSum(name string, db *sql.DB) {
_, err := aorm.Use(db).Debug(false).Where(&Person{Age: aorm.IntFrom(18)}).Sum("age") _, err := aorm.Use(db).Debug(false).Where(&Person{Age: null.IntFrom(18)}).Sum("age")
if err != nil { if err != nil {
panic(name + "testSum" + "found err") panic(name + "testSum" + "found err")
} }
} }
func testAvg(name string, db *sql.DB) { func testAvg(name string, db *sql.DB) {
_, err := aorm.Use(db).Debug(false).Where(&Person{Age: aorm.IntFrom(18)}).Avg("age") _, err := aorm.Use(db).Debug(false).Where(&Person{Age: null.IntFrom(18)}).Avg("age")
if err != nil { if err != nil {
panic(name + "testAvg" + "found err") panic(name + "testAvg" + "found err")
} }
} }
func testMin(name string, db *sql.DB) { func testMin(name string, db *sql.DB) {
_, err := aorm.Use(db).Debug(false).Where(&Person{Age: aorm.IntFrom(18)}).Min("age") _, err := aorm.Use(db).Debug(false).Where(&Person{Age: null.IntFrom(18)}).Min("age")
if err != nil { if err != nil {
panic(name + "testMin" + "found err") panic(name + "testMin" + "found err")
} }
} }
func testMax(name string, db *sql.DB) { func testMax(name string, db *sql.DB) {
_, err := aorm.Use(db).Debug(false).Where(&Person{Age: aorm.IntFrom(18)}).Max("age") _, err := aorm.Use(db).Debug(false).Where(&Person{Age: null.IntFrom(18)}).Max("age")
if err != nil { if err != nil {
panic(name + "testMax" + "found err") panic(name + "testMax" + "found err")
} }
@@ -506,7 +531,7 @@ func testTransaction(name string, db *sql.DB) {
tx, _ := db.Begin() tx, _ := db.Begin()
id, errInsert := aorm.Use(tx).Debug(false).Insert(&Person{ id, errInsert := aorm.Use(tx).Debug(false).Insert(&Person{
Name: aorm.StringFrom("Alice"), Name: null.StringFrom("Alice"),
}) })
if errInsert != nil { if errInsert != nil {
@@ -516,7 +541,7 @@ func testTransaction(name string, db *sql.DB) {
} }
_, errCount := aorm.Use(tx).Debug(false).Where(&Person{ _, errCount := aorm.Use(tx).Debug(false).Where(&Person{
Id: aorm.IntFrom(id), Id: null.IntFrom(id),
}).Count("*") }).Count("*")
if errCount != nil { if errCount != nil {
tx.Rollback() tx.Rollback()
@@ -526,7 +551,7 @@ func testTransaction(name string, db *sql.DB) {
var person Person var person Person
errPerson := aorm.Use(tx).Debug(false).Where(&Person{ errPerson := aorm.Use(tx).Debug(false).Where(&Person{
Id: aorm.IntFrom(id), Id: null.IntFrom(id),
}).GetOne(&person) }).GetOne(&person)
if errPerson != nil { if errPerson != nil {
tx.Rollback() tx.Rollback()
@@ -535,9 +560,9 @@ func testTransaction(name string, db *sql.DB) {
} }
_, errUpdate := aorm.Use(tx).Debug(false).Where(&Person{ _, errUpdate := aorm.Use(tx).Debug(false).Where(&Person{
Id: aorm.IntFrom(id), Id: null.IntFrom(id),
}).Update(&Person{ }).Update(&Person{
Name: aorm.StringFrom("Bob"), Name: null.StringFrom("Bob"),
}) })
if errUpdate != nil { if errUpdate != nil {
@@ -559,9 +584,9 @@ func testTruncate(name string, db *sql.DB) {
func testHelper(name string, db *sql.DB) { func testHelper(name string, db *sql.DB) {
var list2 []ArticleVO var list2 []ArticleVO
var where2 []aorm.WhereItem var where2 []executor.WhereItem
where2 = append(where2, aorm.WhereItem{Field: "o.type", Opt: aorm.Eq, Val: 0}) where2 = append(where2, executor.WhereItem{Field: "o.type", Opt: executor.Eq, Val: 0})
where2 = append(where2, aorm.WhereItem{Field: "p.age", Opt: aorm.In, Val: []int{18, 20}}) where2 = append(where2, executor.WhereItem{Field: "p.age", Opt: executor.In, Val: []int{18, 20}})
err := aorm.Use(db).Debug(false). err := aorm.Use(db).Debug(false).
Table("article o"). Table("article o").
LeftJoin("person p", aorm.Ul("p.id=o.personId")). LeftJoin("person p", aorm.Ul("p.id=o.personId")).