fix bug:reflect.ValueOf(nil) in getFlatParams
This commit is contained in:
parent
bb598b28cd
commit
0f40824f57
@ -57,13 +57,12 @@ func getExistPk(mi *modelInfo, ind reflect.Value) (column string, value interfac
|
||||
func getFlatParams(fi *fieldInfo, args []interface{}, tz *time.Location) (params []interface{}) {
|
||||
outFor:
|
||||
for _, arg := range args {
|
||||
val := reflect.ValueOf(arg)
|
||||
|
||||
if arg == nil {
|
||||
params = append(params, arg)
|
||||
continue
|
||||
}
|
||||
|
||||
|
||||
val := reflect.ValueOf(arg)
|
||||
kind := val.Kind()
|
||||
if kind == reflect.Ptr {
|
||||
val = val.Elem()
|
||||
|
||||
@ -2055,68 +2055,79 @@ func TestRawValues(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestRawPrepare(t *testing.T) {
|
||||
var (
|
||||
result sql.Result
|
||||
err error
|
||||
pre RawPreparer
|
||||
)
|
||||
switch {
|
||||
case IsMysql || IsSqlite:
|
||||
|
||||
pre, err := dORM.Raw("INSERT INTO tag (name) VALUES (?)").Prepare()
|
||||
throwFail(t, err)
|
||||
pre, err = dORM.Raw("INSERT INTO tag (name) VALUES (?)").Prepare()
|
||||
assert.Nil(t, err)
|
||||
if pre != nil {
|
||||
r, err := pre.Exec("name1")
|
||||
throwFail(t, err)
|
||||
result, err = pre.Exec(nil)
|
||||
assert.Nil(t, err)
|
||||
|
||||
tid, err := r.LastInsertId()
|
||||
throwFail(t, err)
|
||||
throwFail(t, AssertIs(tid > 0, true))
|
||||
result, err = pre.Exec("name1")
|
||||
assert.Nil(t, err)
|
||||
|
||||
r, err = pre.Exec("name2")
|
||||
throwFail(t, err)
|
||||
tid, err := result.LastInsertId()
|
||||
assert.Nil(t, err)
|
||||
assert.True(t, tid > 0)
|
||||
|
||||
id, err := r.LastInsertId()
|
||||
throwFail(t, err)
|
||||
throwFail(t, AssertIs(id, tid+1))
|
||||
result, err = pre.Exec("name2")
|
||||
assert.Nil(t, err)
|
||||
|
||||
r, err = pre.Exec("name3")
|
||||
throwFail(t, err)
|
||||
id, err := result.LastInsertId()
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, id, tid+1)
|
||||
|
||||
id, err = r.LastInsertId()
|
||||
throwFail(t, err)
|
||||
throwFail(t, AssertIs(id, tid+2))
|
||||
result, err = pre.Exec("name3")
|
||||
assert.Nil(t, err)
|
||||
|
||||
id, err = result.LastInsertId()
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, id, tid+2)
|
||||
|
||||
err = pre.Close()
|
||||
throwFail(t, err)
|
||||
assert.Nil(t, err)
|
||||
|
||||
res, err := dORM.Raw("DELETE FROM tag WHERE name IN (?, ?, ?)", []string{"name1", "name2", "name3"}).Exec()
|
||||
throwFail(t, err)
|
||||
assert.Nil(t, err)
|
||||
|
||||
num, err := res.RowsAffected()
|
||||
throwFail(t, err)
|
||||
throwFail(t, AssertIs(num, 3))
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, num, 3)
|
||||
}
|
||||
|
||||
case IsPostgres:
|
||||
|
||||
pre, err := dORM.Raw(`INSERT INTO "tag" ("name") VALUES (?) RETURNING "id"`).Prepare()
|
||||
throwFail(t, err)
|
||||
pre, err = dORM.Raw(`INSERT INTO "tag" ("name") VALUES (?) RETURNING "id"`).Prepare()
|
||||
assert.Nil(t, err)
|
||||
if pre != nil {
|
||||
_, err := pre.Exec("name1")
|
||||
throwFail(t, err)
|
||||
_, err = pre.Exec(nil)
|
||||
assert.Nil(t, err)
|
||||
|
||||
_, err = pre.Exec("name1")
|
||||
assert.Nil(t, err)
|
||||
|
||||
_, err = pre.Exec("name2")
|
||||
throwFail(t, err)
|
||||
assert.Nil(t, err)
|
||||
|
||||
_, err = pre.Exec("name3")
|
||||
throwFail(t, err)
|
||||
assert.Nil(t, err)
|
||||
|
||||
err = pre.Close()
|
||||
throwFail(t, err)
|
||||
assert.Nil(t, err)
|
||||
|
||||
res, err := dORM.Raw(`DELETE FROM "tag" WHERE "name" IN (?, ?, ?)`, []string{"name1", "name2", "name3"}).Exec()
|
||||
throwFail(t, err)
|
||||
assert.Nil(t, err)
|
||||
|
||||
if err == nil {
|
||||
num, err := res.RowsAffected()
|
||||
throwFail(t, err)
|
||||
throwFail(t, AssertIs(num, 3))
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, num, 3)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user