github.com/gogf/gf@v1.16.9/database/gdb/gdb_z_mysql_model_test.go (about)

     1  // Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
     2  //
     3  // This Source Code Form is subject to the terms of the MIT License.
     4  // If a copy of the MIT was not distributed with this file,
     5  // You can obtain one at https://github.com/gogf/gf.
     6  
     7  package gdb_test
     8  
     9  import (
    10  	"context"
    11  	"database/sql"
    12  	"fmt"
    13  	"testing"
    14  	"time"
    15  
    16  	"github.com/gogf/gf/container/garray"
    17  	"github.com/gogf/gf/container/gmap"
    18  	"github.com/gogf/gf/debug/gdebug"
    19  	"github.com/gogf/gf/encoding/gparser"
    20  	"github.com/gogf/gf/os/gfile"
    21  	"github.com/gogf/gf/util/gutil"
    22  
    23  	"github.com/gogf/gf/database/gdb"
    24  
    25  	"github.com/gogf/gf/frame/g"
    26  	"github.com/gogf/gf/os/gtime"
    27  	"github.com/gogf/gf/test/gtest"
    28  )
    29  
    30  func Test_Model_Insert(t *testing.T) {
    31  	table := createTable()
    32  	defer dropTable(table)
    33  	gtest.C(t, func(t *gtest.T) {
    34  		user := db.Model(table)
    35  		result, err := user.Data(g.Map{
    36  			"id":          1,
    37  			"uid":         1,
    38  			"passport":    "t1",
    39  			"password":    "25d55ad283aa400af464c76d713c07ad",
    40  			"nickname":    "name_1",
    41  			"create_time": gtime.Now().String(),
    42  		}).Insert()
    43  		t.AssertNil(err)
    44  		n, _ := result.LastInsertId()
    45  		t.Assert(n, 1)
    46  
    47  		result, err = db.Model(table).Data(g.Map{
    48  			"id":          "2",
    49  			"uid":         "2",
    50  			"passport":    "t2",
    51  			"password":    "25d55ad283aa400af464c76d713c07ad",
    52  			"nickname":    "name_2",
    53  			"create_time": gtime.Now().String(),
    54  		}).Insert()
    55  		t.AssertNil(err)
    56  		n, _ = result.RowsAffected()
    57  		t.Assert(n, 1)
    58  
    59  		type User struct {
    60  			Id         int         `gconv:"id"`
    61  			Uid        int         `gconv:"uid"`
    62  			Passport   string      `json:"passport"`
    63  			Password   string      `gconv:"password"`
    64  			Nickname   string      `gconv:"nickname"`
    65  			CreateTime *gtime.Time `json:"create_time"`
    66  		}
    67  		// Model inserting.
    68  		result, err = db.Model(table).Data(User{
    69  			Id:       3,
    70  			Uid:      3,
    71  			Passport: "t3",
    72  			Password: "25d55ad283aa400af464c76d713c07ad",
    73  			Nickname: "name_3",
    74  		}).Insert()
    75  		t.AssertNil(err)
    76  		n, _ = result.RowsAffected()
    77  		t.Assert(n, 1)
    78  		value, err := db.Model(table).Fields("passport").Where("id=3").Value()
    79  		t.AssertNil(err)
    80  		t.Assert(value.String(), "t3")
    81  
    82  		result, err = db.Model(table).Data(&User{
    83  			Id:         4,
    84  			Uid:        4,
    85  			Passport:   "t4",
    86  			Password:   "25d55ad283aa400af464c76d713c07ad",
    87  			Nickname:   "T4",
    88  			CreateTime: gtime.Now(),
    89  		}).Insert()
    90  		t.AssertNil(err)
    91  		n, _ = result.RowsAffected()
    92  		t.Assert(n, 1)
    93  		value, err = db.Model(table).Fields("passport").Where("id=4").Value()
    94  		t.AssertNil(err)
    95  		t.Assert(value.String(), "t4")
    96  
    97  		result, err = db.Model(table).Where("id>?", 1).Delete()
    98  		t.AssertNil(err)
    99  		n, _ = result.RowsAffected()
   100  		t.Assert(n, 3)
   101  	})
   102  }
   103  
   104  // Fix issue: https://github.com/gogf/gf/issues/819
   105  func Test_Model_Insert_WithStructAndSliceAttribute(t *testing.T) {
   106  	table := createTable()
   107  	defer dropTable(table)
   108  	gtest.C(t, func(t *gtest.T) {
   109  		type Password struct {
   110  			Salt string `json:"salt"`
   111  			Pass string `json:"pass"`
   112  		}
   113  		data := g.Map{
   114  			"id":          1,
   115  			"passport":    "t1",
   116  			"password":    &Password{"123", "456"},
   117  			"nickname":    []string{"A", "B", "C"},
   118  			"create_time": gtime.Now().String(),
   119  		}
   120  		_, err := db.Model(table).Data(data).Insert()
   121  		t.AssertNil(err)
   122  
   123  		one, err := db.Model(table).One("id", 1)
   124  		t.AssertNil(err)
   125  		t.Assert(one["passport"], data["passport"])
   126  		t.Assert(one["create_time"], data["create_time"])
   127  		t.Assert(one["nickname"], gparser.MustToJson(data["nickname"]))
   128  	})
   129  }
   130  
   131  func Test_Model_Insert_KeyFieldNameMapping(t *testing.T) {
   132  	table := createTable()
   133  	defer dropTable(table)
   134  
   135  	gtest.C(t, func(t *gtest.T) {
   136  		type User struct {
   137  			Id         int
   138  			Passport   string
   139  			Password   string
   140  			Nickname   string
   141  			CreateTime string
   142  		}
   143  		data := User{
   144  			Id:         1,
   145  			Passport:   "user_1",
   146  			Password:   "pass_1",
   147  			Nickname:   "name_1",
   148  			CreateTime: "2020-10-10 12:00:01",
   149  		}
   150  		_, err := db.Model(table).Data(data).Insert()
   151  		t.AssertNil(err)
   152  
   153  		one, err := db.Model(table).FindOne(1)
   154  		t.AssertNil(err)
   155  		t.Assert(one["passport"], data.Passport)
   156  		t.Assert(one["create_time"], data.CreateTime)
   157  		t.Assert(one["nickname"], data.Nickname)
   158  	})
   159  }
   160  
   161  func Test_Model_Update_KeyFieldNameMapping(t *testing.T) {
   162  	table := createInitTable()
   163  	defer dropTable(table)
   164  
   165  	gtest.C(t, func(t *gtest.T) {
   166  		type User struct {
   167  			Id         int
   168  			Passport   string
   169  			Password   string
   170  			Nickname   string
   171  			CreateTime string
   172  		}
   173  		data := User{
   174  			Id:         1,
   175  			Passport:   "user_10",
   176  			Password:   "pass_10",
   177  			Nickname:   "name_10",
   178  			CreateTime: "2020-10-10 12:00:01",
   179  		}
   180  		_, err := db.Model(table).Data(data).WherePri(1).Update()
   181  		t.AssertNil(err)
   182  
   183  		one, err := db.Model(table).FindOne(1)
   184  		t.AssertNil(err)
   185  		t.Assert(one["passport"], data.Passport)
   186  		t.Assert(one["create_time"], data.CreateTime)
   187  		t.Assert(one["nickname"], data.Nickname)
   188  	})
   189  }
   190  
   191  func Test_Model_Insert_Time(t *testing.T) {
   192  	table := createTable()
   193  	defer dropTable(table)
   194  	gtest.C(t, func(t *gtest.T) {
   195  		data := g.Map{
   196  			"id":          1,
   197  			"passport":    "t1",
   198  			"password":    "p1",
   199  			"nickname":    "n1",
   200  			"create_time": "2020-10-10 20:09:18.334",
   201  		}
   202  		_, err := db.Model(table).Data(data).Insert()
   203  		t.AssertNil(err)
   204  
   205  		one, err := db.Model(table).One("id", 1)
   206  		t.AssertNil(err)
   207  		t.Assert(one["passport"], data["passport"])
   208  		t.Assert(one["create_time"], "2020-10-10 20:09:18")
   209  		t.Assert(one["nickname"], data["nickname"])
   210  	})
   211  }
   212  
   213  func Test_Model_BatchInsertWithArrayStruct(t *testing.T) {
   214  	table := createTable()
   215  	defer dropTable(table)
   216  	gtest.C(t, func(t *gtest.T) {
   217  		user := db.Model(table)
   218  		array := garray.New()
   219  		for i := 1; i <= TableSize; i++ {
   220  			array.Append(g.Map{
   221  				"id":          i,
   222  				"uid":         i,
   223  				"passport":    fmt.Sprintf("t%d", i),
   224  				"password":    "25d55ad283aa400af464c76d713c07ad",
   225  				"nickname":    fmt.Sprintf("name_%d", i),
   226  				"create_time": gtime.Now().String(),
   227  			})
   228  		}
   229  
   230  		result, err := user.Data(array).Insert()
   231  		t.AssertNil(err)
   232  		n, _ := result.LastInsertId()
   233  		t.Assert(n, TableSize)
   234  	})
   235  }
   236  
   237  func Test_Model_InsertIgnore(t *testing.T) {
   238  	table := createInitTable()
   239  	defer dropTable(table)
   240  	gtest.C(t, func(t *gtest.T) {
   241  		_, err := db.Model(table).Data(g.Map{
   242  			"id":          1,
   243  			"uid":         1,
   244  			"passport":    "t1",
   245  			"password":    "25d55ad283aa400af464c76d713c07ad",
   246  			"nickname":    "name_1",
   247  			"create_time": gtime.Now().String(),
   248  		}).Insert()
   249  		t.AssertNE(err, nil)
   250  	})
   251  	gtest.C(t, func(t *gtest.T) {
   252  		_, err := db.Model(table).Data(g.Map{
   253  			"id":          1,
   254  			"uid":         1,
   255  			"passport":    "t1",
   256  			"password":    "25d55ad283aa400af464c76d713c07ad",
   257  			"nickname":    "name_1",
   258  			"create_time": gtime.Now().String(),
   259  		}).InsertIgnore()
   260  		t.AssertNil(err)
   261  	})
   262  }
   263  
   264  func Test_Model_Batch(t *testing.T) {
   265  	// batch insert
   266  	gtest.C(t, func(t *gtest.T) {
   267  		table := createTable()
   268  		defer dropTable(table)
   269  		result, err := db.Model(table).Data(g.List{
   270  			{
   271  				"id":          2,
   272  				"uid":         2,
   273  				"passport":    "t2",
   274  				"password":    "25d55ad283aa400af464c76d713c07ad",
   275  				"nickname":    "name_2",
   276  				"create_time": gtime.Now().String(),
   277  			},
   278  			{
   279  				"id":          3,
   280  				"uid":         3,
   281  				"passport":    "t3",
   282  				"password":    "25d55ad283aa400af464c76d713c07ad",
   283  				"nickname":    "name_3",
   284  				"create_time": gtime.Now().String(),
   285  			},
   286  		}).Batch(1).Insert()
   287  		if err != nil {
   288  			gtest.Error(err)
   289  		}
   290  		n, _ := result.RowsAffected()
   291  		t.Assert(n, 2)
   292  	})
   293  
   294  	// batch insert, retrieving last insert auto-increment id.
   295  	gtest.C(t, func(t *gtest.T) {
   296  		table := createTable()
   297  		defer dropTable(table)
   298  		result, err := db.Model(table).Data(g.List{
   299  			{"passport": "t1"},
   300  			{"passport": "t2"},
   301  			{"passport": "t3"},
   302  			{"passport": "t4"},
   303  			{"passport": "t5"},
   304  		}).Batch(2).Insert()
   305  		if err != nil {
   306  			gtest.Error(err)
   307  		}
   308  		n, _ := result.RowsAffected()
   309  		t.Assert(n, 5)
   310  	})
   311  
   312  	// batch save
   313  	gtest.C(t, func(t *gtest.T) {
   314  		table := createInitTable()
   315  		defer dropTable(table)
   316  		result, err := db.Model(table).All()
   317  		t.AssertNil(err)
   318  		t.Assert(len(result), TableSize)
   319  		for _, v := range result {
   320  			v["nickname"].Set(v["nickname"].String() + v["id"].String())
   321  		}
   322  		r, e := db.Model(table).Data(result).Save()
   323  		t.Assert(e, nil)
   324  		n, e := r.RowsAffected()
   325  		t.Assert(e, nil)
   326  		t.Assert(n, TableSize*2)
   327  	})
   328  
   329  	// batch replace
   330  	gtest.C(t, func(t *gtest.T) {
   331  		table := createInitTable()
   332  		defer dropTable(table)
   333  		result, err := db.Model(table).All()
   334  		t.AssertNil(err)
   335  		t.Assert(len(result), TableSize)
   336  		for _, v := range result {
   337  			v["nickname"].Set(v["nickname"].String() + v["id"].String())
   338  		}
   339  		r, e := db.Model(table).Data(result).Replace()
   340  		t.Assert(e, nil)
   341  		n, e := r.RowsAffected()
   342  		t.Assert(e, nil)
   343  		t.Assert(n, TableSize*2)
   344  	})
   345  }
   346  
   347  func Test_Model_Replace(t *testing.T) {
   348  	table := createTable()
   349  	defer dropTable(table)
   350  
   351  	gtest.C(t, func(t *gtest.T) {
   352  		result, err := db.Model(table).Data(g.Map{
   353  			"id":          1,
   354  			"passport":    "t11",
   355  			"password":    "25d55ad283aa400af464c76d713c07ad",
   356  			"nickname":    "T11",
   357  			"create_time": "2018-10-24 10:00:00",
   358  		}).Replace()
   359  		t.AssertNil(err)
   360  		n, _ := result.RowsAffected()
   361  		t.Assert(n, 1)
   362  	})
   363  }
   364  
   365  func Test_Model_Save(t *testing.T) {
   366  	table := createTable()
   367  	defer dropTable(table)
   368  	gtest.C(t, func(t *gtest.T) {
   369  		result, err := db.Model(table).Data(g.Map{
   370  			"id":          1,
   371  			"passport":    "t111",
   372  			"password":    "25d55ad283aa400af464c76d713c07ad",
   373  			"nickname":    "T111",
   374  			"create_time": "2018-10-24 10:00:00",
   375  		}).Save()
   376  		t.AssertNil(err)
   377  		n, _ := result.RowsAffected()
   378  		t.Assert(n, 1)
   379  	})
   380  }
   381  
   382  func Test_Model_Update(t *testing.T) {
   383  	table := createInitTable()
   384  	defer dropTable(table)
   385  	// UPDATE...LIMIT
   386  	gtest.C(t, func(t *gtest.T) {
   387  		result, err := db.Model(table).Data("nickname", "T100").Where(1).Order("id desc").Limit(2).Update()
   388  		t.AssertNil(err)
   389  		n, _ := result.RowsAffected()
   390  		t.Assert(n, 2)
   391  
   392  		v1, err := db.Model(table).Fields("nickname").Where("id", 10).Value()
   393  		t.AssertNil(err)
   394  		t.Assert(v1.String(), "T100")
   395  
   396  		v2, err := db.Model(table).Fields("nickname").Where("id", 8).Value()
   397  		t.AssertNil(err)
   398  		t.Assert(v2.String(), "name_8")
   399  	})
   400  
   401  	gtest.C(t, func(t *gtest.T) {
   402  		result, err := db.Model(table).Data("passport", "user_22").Where("passport=?", "user_2").Update()
   403  		t.AssertNil(err)
   404  		n, _ := result.RowsAffected()
   405  		t.Assert(n, 1)
   406  	})
   407  
   408  	gtest.C(t, func(t *gtest.T) {
   409  		result, err := db.Model(table).Data("passport", "user_2").Where("passport='user_22'").Update()
   410  		t.AssertNil(err)
   411  		n, _ := result.RowsAffected()
   412  		t.Assert(n, 1)
   413  	})
   414  
   415  	// Update + Data(string)
   416  	gtest.C(t, func(t *gtest.T) {
   417  		result, err := db.Model(table).Data("passport='user_33'").Where("passport='user_3'").Update()
   418  		t.AssertNil(err)
   419  		n, _ := result.RowsAffected()
   420  		t.Assert(n, 1)
   421  	})
   422  	// Update + Fields(string)
   423  	gtest.C(t, func(t *gtest.T) {
   424  		result, err := db.Model(table).Fields("passport").Data(g.Map{
   425  			"passport": "user_44",
   426  			"none":     "none",
   427  		}).Where("passport='user_4'").Update()
   428  		t.AssertNil(err)
   429  		n, _ := result.RowsAffected()
   430  		t.Assert(n, 1)
   431  	})
   432  }
   433  
   434  func Test_Model_Clone(t *testing.T) {
   435  	table := createInitTable()
   436  	defer dropTable(table)
   437  
   438  	gtest.C(t, func(t *gtest.T) {
   439  		md := db.Model(table).Where("id IN(?)", g.Slice{1, 3})
   440  		count, err := md.Count()
   441  		t.AssertNil(err)
   442  
   443  		record, err := md.Order("id DESC").One()
   444  		t.AssertNil(err)
   445  
   446  		result, err := md.Order("id ASC").All()
   447  		t.AssertNil(err)
   448  
   449  		t.Assert(count, 2)
   450  		t.Assert(record["id"].Int(), 3)
   451  		t.Assert(len(result), 2)
   452  		t.Assert(result[0]["id"].Int(), 1)
   453  		t.Assert(result[1]["id"].Int(), 3)
   454  	})
   455  }
   456  
   457  func Test_Model_Safe(t *testing.T) {
   458  	table := createInitTable()
   459  	defer dropTable(table)
   460  
   461  	gtest.C(t, func(t *gtest.T) {
   462  		md := db.Model(table).Safe(false).Where("id IN(?)", g.Slice{1, 3})
   463  		count, err := md.Count()
   464  		t.AssertNil(err)
   465  		t.Assert(count, 2)
   466  
   467  		md.And("id = ?", 1)
   468  		count, err = md.Count()
   469  		t.AssertNil(err)
   470  		t.Assert(count, 1)
   471  	})
   472  	gtest.C(t, func(t *gtest.T) {
   473  		md := db.Model(table).Safe(true).Where("id IN(?)", g.Slice{1, 3})
   474  		count, err := md.Count()
   475  		t.AssertNil(err)
   476  		t.Assert(count, 2)
   477  
   478  		md.And("id = ?", 1)
   479  		count, err = md.Count()
   480  		t.AssertNil(err)
   481  		t.Assert(count, 2)
   482  	})
   483  
   484  	gtest.C(t, func(t *gtest.T) {
   485  		md := db.Model(table).Safe().Where("id IN(?)", g.Slice{1, 3})
   486  		count, err := md.Count()
   487  		t.AssertNil(err)
   488  		t.Assert(count, 2)
   489  
   490  		md.And("id = ?", 1)
   491  		count, err = md.Count()
   492  		t.AssertNil(err)
   493  		t.Assert(count, 2)
   494  	})
   495  	gtest.C(t, func(t *gtest.T) {
   496  		md1 := db.Model(table).Safe()
   497  		md2 := md1.Where("id in (?)", g.Slice{1, 3})
   498  		count, err := md2.Count()
   499  		t.AssertNil(err)
   500  		t.Assert(count, 2)
   501  
   502  		all, err := md2.All()
   503  		t.AssertNil(err)
   504  		t.Assert(len(all), 2)
   505  
   506  		all, err = md2.Page(1, 10).All()
   507  		t.AssertNil(err)
   508  		t.Assert(len(all), 2)
   509  	})
   510  
   511  	gtest.C(t, func(t *gtest.T) {
   512  		table := createInitTable()
   513  		defer dropTable(table)
   514  
   515  		md1 := db.Model(table).Where("id>", 0).Safe()
   516  		md2 := md1.Where("id in (?)", g.Slice{1, 3})
   517  		md3 := md1.Where("id in (?)", g.Slice{4, 5, 6})
   518  
   519  		// 1,3
   520  		count, err := md2.Count()
   521  		t.AssertNil(err)
   522  		t.Assert(count, 2)
   523  
   524  		all, err := md2.Order("id asc").All()
   525  		t.AssertNil(err)
   526  		t.Assert(len(all), 2)
   527  		t.Assert(all[0]["id"].Int(), 1)
   528  		t.Assert(all[1]["id"].Int(), 3)
   529  
   530  		all, err = md2.Page(1, 10).All()
   531  		t.AssertNil(err)
   532  		t.Assert(len(all), 2)
   533  
   534  		// 4,5,6
   535  		count, err = md3.Count()
   536  		t.AssertNil(err)
   537  		t.Assert(count, 3)
   538  
   539  		all, err = md3.Order("id asc").All()
   540  		t.AssertNil(err)
   541  		t.Assert(len(all), 3)
   542  		t.Assert(all[0]["id"].Int(), 4)
   543  		t.Assert(all[1]["id"].Int(), 5)
   544  		t.Assert(all[2]["id"].Int(), 6)
   545  
   546  		all, err = md3.Page(1, 10).All()
   547  		t.AssertNil(err)
   548  		t.Assert(len(all), 3)
   549  	})
   550  }
   551  
   552  func Test_Model_All(t *testing.T) {
   553  	table := createInitTable()
   554  	defer dropTable(table)
   555  
   556  	gtest.C(t, func(t *gtest.T) {
   557  		result, err := db.Model(table).All()
   558  		t.AssertNil(err)
   559  		t.Assert(len(result), TableSize)
   560  	})
   561  	gtest.C(t, func(t *gtest.T) {
   562  		result, err := db.Model(table).Where("id<0").All()
   563  		t.Assert(result, nil)
   564  		t.AssertNil(err)
   565  	})
   566  }
   567  
   568  func Test_Model_Fields(t *testing.T) {
   569  	tableName1 := createInitTable()
   570  	defer dropTable(tableName1)
   571  
   572  	tableName2 := "user_" + gtime.Now().TimestampNanoStr()
   573  	if _, err := db.Exec(fmt.Sprintf(`
   574  	    CREATE TABLE %s (
   575  	        id         int(10) unsigned NOT NULL AUTO_INCREMENT,
   576  	        name       varchar(45) NULL,
   577  			age        int(10) unsigned,
   578  	        PRIMARY KEY (id)
   579  	    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
   580  	    `, tableName2,
   581  	)); err != nil {
   582  		gtest.AssertNil(err)
   583  	}
   584  	defer dropTable(tableName2)
   585  
   586  	r, err := db.Insert(tableName2, g.Map{
   587  		"id":   1,
   588  		"name": "table2_1",
   589  		"age":  18,
   590  	})
   591  	gtest.AssertNil(err)
   592  	n, _ := r.RowsAffected()
   593  	gtest.Assert(n, 1)
   594  
   595  	gtest.C(t, func(t *gtest.T) {
   596  		all, err := db.Model(tableName1).As("u").Fields("u.passport,u.id").Where("u.id<2").All()
   597  		t.AssertNil(err)
   598  		t.Assert(len(all), 1)
   599  		t.Assert(len(all[0]), 2)
   600  	})
   601  	gtest.C(t, func(t *gtest.T) {
   602  		all, err := db.Model(tableName1).As("u1").
   603  			LeftJoin(tableName1, "u2", "u2.id=u1.id").
   604  			Fields("u1.passport,u1.id,u2.id AS u2id").
   605  			Where("u1.id<2").
   606  			All()
   607  		t.AssertNil(err)
   608  		t.Assert(len(all), 1)
   609  		t.Assert(len(all[0]), 3)
   610  	})
   611  	gtest.C(t, func(t *gtest.T) {
   612  		all, err := db.Model(tableName1).As("u1").
   613  			LeftJoin(tableName2, "u2", "u2.id=u1.id").
   614  			Fields("u1.passport,u1.id,u2.name,u2.age").
   615  			Where("u1.id<2").
   616  			All()
   617  		t.AssertNil(err)
   618  		t.Assert(len(all), 1)
   619  		t.Assert(len(all[0]), 4)
   620  		t.Assert(all[0]["id"], 1)
   621  		t.Assert(all[0]["age"], 18)
   622  		t.Assert(all[0]["name"], "table2_1")
   623  		t.Assert(all[0]["passport"], "user_1")
   624  	})
   625  }
   626  
   627  func Test_Model_FindAll(t *testing.T) {
   628  	table := createInitTable()
   629  	defer dropTable(table)
   630  
   631  	gtest.C(t, func(t *gtest.T) {
   632  		result, err := db.Model(table).FindAll(5)
   633  		t.AssertNil(err)
   634  		t.Assert(len(result), 1)
   635  		t.Assert(result[0]["id"].Int(), 5)
   636  	})
   637  
   638  	gtest.C(t, func(t *gtest.T) {
   639  		result, err := db.Model(table).Order("id asc").FindAll("id", 8)
   640  		t.AssertNil(err)
   641  		t.Assert(len(result), 1)
   642  		t.Assert(result[0]["id"].Int(), 8)
   643  	})
   644  
   645  	gtest.C(t, func(t *gtest.T) {
   646  		result, err := db.Model(table).Order("id asc").FindAll(g.Slice{3, 9})
   647  		t.AssertNil(err)
   648  		t.Assert(len(result), 2)
   649  		t.Assert(result[0]["id"].Int(), 3)
   650  		t.Assert(result[1]["id"].Int(), 9)
   651  	})
   652  
   653  	gtest.C(t, func(t *gtest.T) {
   654  		result, err := db.Model(table).FindAll()
   655  		t.AssertNil(err)
   656  		t.Assert(len(result), TableSize)
   657  	})
   658  	gtest.C(t, func(t *gtest.T) {
   659  		result, err := db.Model(table).Where("id<0").FindAll()
   660  		t.Assert(result, nil)
   661  		t.AssertNil(err)
   662  	})
   663  }
   664  
   665  func Test_Model_FindAll_GTime(t *testing.T) {
   666  	table := createInitTable()
   667  	defer dropTable(table)
   668  
   669  	gtest.C(t, func(t *gtest.T) {
   670  		result, err := db.Model(table).FindAll("create_time < ?", gtime.NewFromStr("2000-01-01 00:00:00"))
   671  		t.AssertNil(err)
   672  		t.Assert(len(result), 0)
   673  	})
   674  	gtest.C(t, func(t *gtest.T) {
   675  		result, err := db.Model(table).FindAll("create_time > ?", gtime.NewFromStr("2000-01-01 00:00:00"))
   676  		t.AssertNil(err)
   677  		t.Assert(len(result), TableSize)
   678  	})
   679  
   680  	gtest.C(t, func(t *gtest.T) {
   681  		v := g.NewVar("2000-01-01 00:00:00")
   682  		result, err := db.Model(table).FindAll("create_time < ?", v)
   683  		t.AssertNil(err)
   684  		t.Assert(len(result), 0)
   685  	})
   686  
   687  	gtest.C(t, func(t *gtest.T) {
   688  		v := g.NewVar("2000-01-01 00:00:00")
   689  		result, err := db.Model(table).FindAll("create_time > ?", v)
   690  		t.AssertNil(err)
   691  		t.Assert(len(result), TableSize)
   692  	})
   693  }
   694  
   695  func Test_Model_One(t *testing.T) {
   696  	table := createInitTable()
   697  	defer dropTable(table)
   698  	gtest.C(t, func(t *gtest.T) {
   699  		record, err := db.Model(table).Where("id", 1).One()
   700  		t.AssertNil(err)
   701  		t.Assert(record["nickname"].String(), "name_1")
   702  	})
   703  
   704  	gtest.C(t, func(t *gtest.T) {
   705  		record, err := db.Model(table).Where("id", 0).One()
   706  		t.AssertNil(err)
   707  		t.Assert(record, nil)
   708  	})
   709  }
   710  
   711  func Test_Model_FindOne(t *testing.T) {
   712  	table := createInitTable()
   713  	defer dropTable(table)
   714  
   715  	gtest.C(t, func(t *gtest.T) {
   716  		record, err := db.Model(table).FindOne(1)
   717  		t.AssertNil(err)
   718  		t.Assert(record["nickname"].String(), "name_1")
   719  	})
   720  
   721  	gtest.C(t, func(t *gtest.T) {
   722  		record, err := db.Model(table).FindOne(3)
   723  		t.AssertNil(err)
   724  		t.Assert(record["nickname"].String(), "name_3")
   725  	})
   726  
   727  	gtest.C(t, func(t *gtest.T) {
   728  		record, err := db.Model(table).Where("id", 1).FindOne()
   729  		t.AssertNil(err)
   730  		t.Assert(record["nickname"].String(), "name_1")
   731  	})
   732  
   733  	gtest.C(t, func(t *gtest.T) {
   734  		record, err := db.Model(table).FindOne("id", 9)
   735  		t.AssertNil(err)
   736  		t.Assert(record["nickname"].String(), "name_9")
   737  	})
   738  
   739  	gtest.C(t, func(t *gtest.T) {
   740  		record, err := db.Model(table).Where("id", 0).FindOne()
   741  		t.AssertNil(err)
   742  		t.Assert(record, nil)
   743  	})
   744  }
   745  
   746  func Test_Model_Value(t *testing.T) {
   747  	table := createInitTable()
   748  	defer dropTable(table)
   749  
   750  	gtest.C(t, func(t *gtest.T) {
   751  		value, err := db.Model(table).Fields("nickname").Where("id", 1).Value()
   752  		t.AssertNil(err)
   753  		t.Assert(value.String(), "name_1")
   754  	})
   755  
   756  	gtest.C(t, func(t *gtest.T) {
   757  		value, err := db.Model(table).Fields("nickname").Where("id", 0).Value()
   758  		t.AssertNil(err)
   759  		t.Assert(value, nil)
   760  	})
   761  }
   762  
   763  func Test_Model_Array(t *testing.T) {
   764  	table := createInitTable()
   765  	defer dropTable(table)
   766  
   767  	gtest.C(t, func(t *gtest.T) {
   768  		all, err := db.Model(table).Where("id", g.Slice{1, 2, 3}).All()
   769  		t.AssertNil(err)
   770  		t.Assert(all.Array("id"), g.Slice{1, 2, 3})
   771  		t.Assert(all.Array("nickname"), g.Slice{"name_1", "name_2", "name_3"})
   772  	})
   773  	gtest.C(t, func(t *gtest.T) {
   774  		array, err := db.Model(table).Fields("nickname").Where("id", g.Slice{1, 2, 3}).Array()
   775  		t.AssertNil(err)
   776  		t.Assert(array, g.Slice{"name_1", "name_2", "name_3"})
   777  	})
   778  	gtest.C(t, func(t *gtest.T) {
   779  		array, err := db.Model(table).Array("nickname", "id", g.Slice{1, 2, 3})
   780  		t.AssertNil(err)
   781  		t.Assert(array, g.Slice{"name_1", "name_2", "name_3"})
   782  	})
   783  	gtest.C(t, func(t *gtest.T) {
   784  		array, err := db.Model(table).FindArray("nickname", "id", g.Slice{1, 2, 3})
   785  		t.AssertNil(err)
   786  		t.Assert(array, g.Slice{"name_1", "name_2", "name_3"})
   787  	})
   788  	gtest.C(t, func(t *gtest.T) {
   789  		array, err := db.Model(table).FindArray("nickname", g.Slice{1, 2, 3})
   790  		t.AssertNil(err)
   791  		t.Assert(array, g.Slice{"name_1", "name_2", "name_3"})
   792  	})
   793  }
   794  
   795  func Test_Model_FindValue(t *testing.T) {
   796  	table := createInitTable()
   797  	defer dropTable(table)
   798  
   799  	gtest.C(t, func(t *gtest.T) {
   800  		value, err := db.Model(table).FindValue("nickname", 1)
   801  		t.AssertNil(err)
   802  		t.Assert(value.String(), "name_1")
   803  	})
   804  
   805  	gtest.C(t, func(t *gtest.T) {
   806  		value, err := db.Model(table).Order("id desc").FindValue("nickname")
   807  		t.AssertNil(err)
   808  		t.Assert(value.String(), "name_10")
   809  	})
   810  
   811  	gtest.C(t, func(t *gtest.T) {
   812  		value, err := db.Model(table).Fields("nickname").Where("id", 1).FindValue()
   813  		t.AssertNil(err)
   814  		t.Assert(value.String(), "name_1")
   815  	})
   816  
   817  	gtest.C(t, func(t *gtest.T) {
   818  		value, err := db.Model(table).Fields("nickname").Where("id", 0).FindValue()
   819  		t.AssertNil(err)
   820  		t.Assert(value, nil)
   821  	})
   822  }
   823  
   824  func Test_Model_Count(t *testing.T) {
   825  	table := createInitTable()
   826  	defer dropTable(table)
   827  	gtest.C(t, func(t *gtest.T) {
   828  		count, err := db.Model(table).Count()
   829  		t.AssertNil(err)
   830  		t.Assert(count, TableSize)
   831  	})
   832  	gtest.C(t, func(t *gtest.T) {
   833  		count, err := db.Model(table).FieldsEx("id").Where("id>8").Count()
   834  		t.AssertNil(err)
   835  		t.Assert(count, 2)
   836  	})
   837  	gtest.C(t, func(t *gtest.T) {
   838  		count, err := db.Model(table).Fields("distinct id,nickname").Where("id>8").Count()
   839  		t.AssertNil(err)
   840  		t.Assert(count, 2)
   841  	})
   842  	// COUNT...LIMIT...
   843  	gtest.C(t, func(t *gtest.T) {
   844  		count, err := db.Model(table).Page(1, 2).Count()
   845  		t.AssertNil(err)
   846  		t.Assert(count, TableSize)
   847  	})
   848  	//gtest.C(t, func(t *gtest.T) {
   849  	//	count, err := db.Model(table).Fields("id myid").Where("id>8").Count()
   850  	//	t.AssertNil(err)
   851  	//	t.Assert(count, 2)
   852  	//})
   853  	//gtest.C(t, func(t *gtest.T) {
   854  	//	count, err := db.Model(table).As("u1").LeftJoin(table, "u2", "u2.id=u1.id").Fields("u2.id u2id").Where("u1.id>8").Count()
   855  	//	t.AssertNil(err)
   856  	//	t.Assert(count, 2)
   857  	//})
   858  }
   859  
   860  func Test_Model_FindCount(t *testing.T) {
   861  	table := createInitTable()
   862  	defer dropTable(table)
   863  	gtest.C(t, func(t *gtest.T) {
   864  		count, err := db.Model(table).FindCount(g.Slice{1, 3})
   865  		t.AssertNil(err)
   866  		t.Assert(count, 2)
   867  	})
   868  	gtest.C(t, func(t *gtest.T) {
   869  		count, err := db.Model(table).FindCount(g.Slice{1, 300000})
   870  		t.AssertNil(err)
   871  		t.Assert(count, 1)
   872  	})
   873  	gtest.C(t, func(t *gtest.T) {
   874  		count, err := db.Model(table).FindCount()
   875  		t.AssertNil(err)
   876  		t.Assert(count, TableSize)
   877  	})
   878  }
   879  
   880  func Test_Model_Select(t *testing.T) {
   881  	table := createInitTable()
   882  	defer dropTable(table)
   883  	gtest.C(t, func(t *gtest.T) {
   884  		result, err := db.Model(table).Select()
   885  		t.AssertNil(err)
   886  		t.Assert(len(result), TableSize)
   887  	})
   888  }
   889  
   890  func Test_Model_Struct(t *testing.T) {
   891  	table := createInitTable()
   892  	defer dropTable(table)
   893  	gtest.C(t, func(t *gtest.T) {
   894  		type User struct {
   895  			Id         int
   896  			Passport   string
   897  			Password   string
   898  			NickName   string
   899  			CreateTime gtime.Time
   900  		}
   901  		user := new(User)
   902  		err := db.Model(table).Where("id=1").Scan(user)
   903  		t.AssertNil(err)
   904  		t.Assert(user.NickName, "name_1")
   905  		t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00")
   906  	})
   907  	gtest.C(t, func(t *gtest.T) {
   908  		type User struct {
   909  			Id         int
   910  			Passport   string
   911  			Password   string
   912  			NickName   string
   913  			CreateTime *gtime.Time
   914  		}
   915  		user := new(User)
   916  		err := db.Model(table).Where("id=1").Scan(user)
   917  		t.AssertNil(err)
   918  		t.Assert(user.NickName, "name_1")
   919  		t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00")
   920  	})
   921  	// Auto creating struct object.
   922  	gtest.C(t, func(t *gtest.T) {
   923  		type User struct {
   924  			Id         int
   925  			Passport   string
   926  			Password   string
   927  			NickName   string
   928  			CreateTime *gtime.Time
   929  		}
   930  		user := (*User)(nil)
   931  		err := db.Model(table).Where("id=1").Scan(&user)
   932  		t.AssertNil(err)
   933  		t.Assert(user.NickName, "name_1")
   934  		t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00")
   935  	})
   936  	// Just using Scan.
   937  	gtest.C(t, func(t *gtest.T) {
   938  		type User struct {
   939  			Id         int
   940  			Passport   string
   941  			Password   string
   942  			NickName   string
   943  			CreateTime *gtime.Time
   944  		}
   945  		user := (*User)(nil)
   946  		err := db.Model(table).Where("id=1").Scan(&user)
   947  		if err != nil {
   948  			gtest.Error(err)
   949  		}
   950  		t.Assert(user.NickName, "name_1")
   951  		t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00")
   952  	})
   953  	// sql.ErrNoRows
   954  	gtest.C(t, func(t *gtest.T) {
   955  		type User struct {
   956  			Id         int
   957  			Passport   string
   958  			Password   string
   959  			NickName   string
   960  			CreateTime *gtime.Time
   961  		}
   962  		user := new(User)
   963  		err := db.Model(table).Where("id=-1").Scan(user)
   964  		t.Assert(err, sql.ErrNoRows)
   965  	})
   966  	gtest.C(t, func(t *gtest.T) {
   967  		type User struct {
   968  			Id         int
   969  			Passport   string
   970  			Password   string
   971  			NickName   string
   972  			CreateTime *gtime.Time
   973  		}
   974  		var user *User
   975  		err := db.Model(table).Where("id=-1").Scan(&user)
   976  		t.AssertNil(err)
   977  	})
   978  }
   979  
   980  func Test_Model_Struct_CustomType(t *testing.T) {
   981  	table := createInitTable()
   982  	defer dropTable(table)
   983  
   984  	type MyInt int
   985  
   986  	gtest.C(t, func(t *gtest.T) {
   987  		type User struct {
   988  			Id         MyInt
   989  			Passport   string
   990  			Password   string
   991  			NickName   string
   992  			CreateTime gtime.Time
   993  		}
   994  		user := new(User)
   995  		err := db.Model(table).Where("id=1").Scan(user)
   996  		t.AssertNil(err)
   997  		t.Assert(user.NickName, "name_1")
   998  		t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00")
   999  	})
  1000  }
  1001  
  1002  func Test_Model_Structs(t *testing.T) {
  1003  	table := createInitTable()
  1004  	defer dropTable(table)
  1005  
  1006  	gtest.C(t, func(t *gtest.T) {
  1007  		type User struct {
  1008  			Id         int
  1009  			Passport   string
  1010  			Password   string
  1011  			NickName   string
  1012  			CreateTime gtime.Time
  1013  		}
  1014  		var users []User
  1015  		err := db.Model(table).Order("id asc").Scan(&users)
  1016  		if err != nil {
  1017  			gtest.Error(err)
  1018  		}
  1019  		t.Assert(len(users), TableSize)
  1020  		t.Assert(users[0].Id, 1)
  1021  		t.Assert(users[1].Id, 2)
  1022  		t.Assert(users[2].Id, 3)
  1023  		t.Assert(users[0].NickName, "name_1")
  1024  		t.Assert(users[1].NickName, "name_2")
  1025  		t.Assert(users[2].NickName, "name_3")
  1026  		t.Assert(users[0].CreateTime.String(), "2018-10-24 10:00:00")
  1027  	})
  1028  	// Auto create struct slice.
  1029  	gtest.C(t, func(t *gtest.T) {
  1030  		type User struct {
  1031  			Id         int
  1032  			Passport   string
  1033  			Password   string
  1034  			NickName   string
  1035  			CreateTime *gtime.Time
  1036  		}
  1037  		var users []*User
  1038  		err := db.Model(table).Order("id asc").Scan(&users)
  1039  		if err != nil {
  1040  			gtest.Error(err)
  1041  		}
  1042  		t.Assert(len(users), TableSize)
  1043  		t.Assert(users[0].Id, 1)
  1044  		t.Assert(users[1].Id, 2)
  1045  		t.Assert(users[2].Id, 3)
  1046  		t.Assert(users[0].NickName, "name_1")
  1047  		t.Assert(users[1].NickName, "name_2")
  1048  		t.Assert(users[2].NickName, "name_3")
  1049  		t.Assert(users[0].CreateTime.String(), "2018-10-24 10:00:00")
  1050  	})
  1051  	// Just using Scan.
  1052  	gtest.C(t, func(t *gtest.T) {
  1053  		type User struct {
  1054  			Id         int
  1055  			Passport   string
  1056  			Password   string
  1057  			NickName   string
  1058  			CreateTime *gtime.Time
  1059  		}
  1060  		var users []*User
  1061  		err := db.Model(table).Order("id asc").Scan(&users)
  1062  		if err != nil {
  1063  			gtest.Error(err)
  1064  		}
  1065  		t.Assert(len(users), TableSize)
  1066  		t.Assert(users[0].Id, 1)
  1067  		t.Assert(users[1].Id, 2)
  1068  		t.Assert(users[2].Id, 3)
  1069  		t.Assert(users[0].NickName, "name_1")
  1070  		t.Assert(users[1].NickName, "name_2")
  1071  		t.Assert(users[2].NickName, "name_3")
  1072  		t.Assert(users[0].CreateTime.String(), "2018-10-24 10:00:00")
  1073  	})
  1074  	// sql.ErrNoRows
  1075  	gtest.C(t, func(t *gtest.T) {
  1076  		type User struct {
  1077  			Id         int
  1078  			Passport   string
  1079  			Password   string
  1080  			NickName   string
  1081  			CreateTime *gtime.Time
  1082  		}
  1083  		var users []*User
  1084  		err := db.Model(table).Where("id<0").Scan(&users)
  1085  		t.AssertNil(err)
  1086  	})
  1087  }
  1088  
  1089  // JSON tag is only used for JSON Marshal/Unmarshal, DO NOT use it in multiple purposes!
  1090  //func Test_Model_StructsWithJsonTag(t *testing.T) {
  1091  //	table := createInitTable()
  1092  //	defer dropTable(table)
  1093  //
  1094  //	db.SetDebug(true)
  1095  //	gtest.C(t, func(t *gtest.T) {
  1096  //		type User struct {
  1097  //			Uid      int `json:"id"`
  1098  //			Passport string
  1099  //			Password string
  1100  //			Name     string     `json:"nick_name"`
  1101  //			Time     gtime.Time `json:"create_time"`
  1102  //		}
  1103  //		var users []User
  1104  //		err := db.Model(table).Order("id asc").Scan(&users)
  1105  //		if err != nil {
  1106  //			gtest.Error(err)
  1107  //		}
  1108  //		t.Assert(len(users), TableSize)
  1109  //		t.Assert(users[0].Uid, 1)
  1110  //		t.Assert(users[1].Uid, 2)
  1111  //		t.Assert(users[2].Uid, 3)
  1112  //		t.Assert(users[0].Name, "name_1")
  1113  //		t.Assert(users[1].Name, "name_2")
  1114  //		t.Assert(users[2].Name, "name_3")
  1115  //		t.Assert(users[0].Time.String(), "2018-10-24 10:00:00")
  1116  //	})
  1117  //}
  1118  
  1119  func Test_Model_Scan(t *testing.T) {
  1120  	table := createInitTable()
  1121  	defer dropTable(table)
  1122  
  1123  	gtest.C(t, func(t *gtest.T) {
  1124  		type User struct {
  1125  			Id         int
  1126  			Passport   string
  1127  			Password   string
  1128  			NickName   string
  1129  			CreateTime gtime.Time
  1130  		}
  1131  		user := new(User)
  1132  		err := db.Model(table).Where("id=1").Scan(user)
  1133  		t.AssertNil(err)
  1134  		t.Assert(user.NickName, "name_1")
  1135  		t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00")
  1136  	})
  1137  	gtest.C(t, func(t *gtest.T) {
  1138  		type User struct {
  1139  			Id         int
  1140  			Passport   string
  1141  			Password   string
  1142  			NickName   string
  1143  			CreateTime *gtime.Time
  1144  		}
  1145  		user := new(User)
  1146  		err := db.Model(table).Where("id=1").Scan(user)
  1147  		t.AssertNil(err)
  1148  		t.Assert(user.NickName, "name_1")
  1149  		t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00")
  1150  	})
  1151  	gtest.C(t, func(t *gtest.T) {
  1152  		type User struct {
  1153  			Id         int
  1154  			Passport   string
  1155  			Password   string
  1156  			NickName   string
  1157  			CreateTime gtime.Time
  1158  		}
  1159  		var users []User
  1160  		err := db.Model(table).Order("id asc").Scan(&users)
  1161  		t.AssertNil(err)
  1162  		t.Assert(len(users), TableSize)
  1163  		t.Assert(users[0].Id, 1)
  1164  		t.Assert(users[1].Id, 2)
  1165  		t.Assert(users[2].Id, 3)
  1166  		t.Assert(users[0].NickName, "name_1")
  1167  		t.Assert(users[1].NickName, "name_2")
  1168  		t.Assert(users[2].NickName, "name_3")
  1169  		t.Assert(users[0].CreateTime.String(), "2018-10-24 10:00:00")
  1170  	})
  1171  	gtest.C(t, func(t *gtest.T) {
  1172  		type User struct {
  1173  			Id         int
  1174  			Passport   string
  1175  			Password   string
  1176  			NickName   string
  1177  			CreateTime *gtime.Time
  1178  		}
  1179  		var users []*User
  1180  		err := db.Model(table).Order("id asc").Scan(&users)
  1181  		t.AssertNil(err)
  1182  		t.Assert(len(users), TableSize)
  1183  		t.Assert(users[0].Id, 1)
  1184  		t.Assert(users[1].Id, 2)
  1185  		t.Assert(users[2].Id, 3)
  1186  		t.Assert(users[0].NickName, "name_1")
  1187  		t.Assert(users[1].NickName, "name_2")
  1188  		t.Assert(users[2].NickName, "name_3")
  1189  		t.Assert(users[0].CreateTime.String(), "2018-10-24 10:00:00")
  1190  	})
  1191  	// sql.ErrNoRows
  1192  	gtest.C(t, func(t *gtest.T) {
  1193  		type User struct {
  1194  			Id         int
  1195  			Passport   string
  1196  			Password   string
  1197  			NickName   string
  1198  			CreateTime *gtime.Time
  1199  		}
  1200  		var (
  1201  			user  = new(User)
  1202  			users = new([]*User)
  1203  		)
  1204  		err1 := db.Model(table).Where("id < 0").Scan(user)
  1205  		err2 := db.Model(table).Where("id < 0").Scan(users)
  1206  		t.Assert(err1, sql.ErrNoRows)
  1207  		t.Assert(err2, nil)
  1208  	})
  1209  }
  1210  
  1211  func Test_Model_OrderBy(t *testing.T) {
  1212  	table := createInitTable()
  1213  	defer dropTable(table)
  1214  
  1215  	gtest.C(t, func(t *gtest.T) {
  1216  		result, err := db.Model(table).Order("id DESC").Select()
  1217  		t.AssertNil(err)
  1218  		t.Assert(len(result), TableSize)
  1219  		t.Assert(result[0]["nickname"].String(), fmt.Sprintf("name_%d", TableSize))
  1220  	})
  1221  }
  1222  
  1223  func Test_Model_GroupBy(t *testing.T) {
  1224  	table := createInitTable()
  1225  	defer dropTable(table)
  1226  
  1227  	gtest.C(t, func(t *gtest.T) {
  1228  		result, err := db.Model(table).GroupBy("id").Select()
  1229  		t.AssertNil(err)
  1230  		t.Assert(len(result), TableSize)
  1231  		t.Assert(result[0]["nickname"].String(), "name_1")
  1232  	})
  1233  }
  1234  
  1235  func Test_Model_Data(t *testing.T) {
  1236  	gtest.C(t, func(t *gtest.T) {
  1237  		table := createInitTable()
  1238  		defer dropTable(table)
  1239  		result, err := db.Model(table).Data("nickname=?", "test").Where("id=?", 3).Update()
  1240  		t.AssertNil(err)
  1241  		n, _ := result.RowsAffected()
  1242  		t.Assert(n, 1)
  1243  	})
  1244  	gtest.C(t, func(t *gtest.T) {
  1245  		table := createTable()
  1246  		defer dropTable(table)
  1247  		users := make([]g.MapStrAny, 0)
  1248  		for i := 1; i <= 10; i++ {
  1249  			users = append(users, g.MapStrAny{
  1250  				"id":       i,
  1251  				"passport": fmt.Sprintf(`passport_%d`, i),
  1252  				"password": fmt.Sprintf(`password_%d`, i),
  1253  				"nickname": fmt.Sprintf(`nickname_%d`, i),
  1254  			})
  1255  		}
  1256  		result, err := db.Model(table).Data(users).Batch(2).Insert()
  1257  		t.AssertNil(err)
  1258  		n, _ := result.RowsAffected()
  1259  		t.Assert(n, 10)
  1260  	})
  1261  	gtest.C(t, func(t *gtest.T) {
  1262  		table := createTable()
  1263  		defer dropTable(table)
  1264  		users := garray.New()
  1265  		for i := 1; i <= 10; i++ {
  1266  			users.Append(g.MapStrAny{
  1267  				"id":       i,
  1268  				"passport": fmt.Sprintf(`passport_%d`, i),
  1269  				"password": fmt.Sprintf(`password_%d`, i),
  1270  				"nickname": fmt.Sprintf(`nickname_%d`, i),
  1271  			})
  1272  		}
  1273  		result, err := db.Model(table).Data(users).Batch(2).Insert()
  1274  		t.AssertNil(err)
  1275  		n, _ := result.RowsAffected()
  1276  		t.Assert(n, 10)
  1277  	})
  1278  }
  1279  
  1280  func Test_Model_Where(t *testing.T) {
  1281  	table := createInitTable()
  1282  	defer dropTable(table)
  1283  
  1284  	// string
  1285  	gtest.C(t, func(t *gtest.T) {
  1286  		result, err := db.Model(table).Where("id=? and nickname=?", 3, "name_3").One()
  1287  		t.AssertNil(err)
  1288  		t.AssertGT(len(result), 0)
  1289  		t.Assert(result["id"].Int(), 3)
  1290  	})
  1291  
  1292  	// slice
  1293  	gtest.C(t, func(t *gtest.T) {
  1294  		result, err := db.Model(table).Where(g.Slice{"id", 3}).One()
  1295  		t.AssertNil(err)
  1296  		t.AssertGT(len(result), 0)
  1297  		t.Assert(result["id"].Int(), 3)
  1298  	})
  1299  	gtest.C(t, func(t *gtest.T) {
  1300  		result, err := db.Model(table).Where(g.Slice{"id", 3, "nickname", "name_3"}).One()
  1301  		t.AssertNil(err)
  1302  		t.AssertGT(len(result), 0)
  1303  		t.Assert(result["id"].Int(), 3)
  1304  	})
  1305  
  1306  	// slice parameter
  1307  	gtest.C(t, func(t *gtest.T) {
  1308  		result, err := db.Model(table).Where("id=? and nickname=?", g.Slice{3, "name_3"}).One()
  1309  		t.AssertNil(err)
  1310  		t.AssertGT(len(result), 0)
  1311  		t.Assert(result["id"].Int(), 3)
  1312  	})
  1313  	// map like
  1314  	gtest.C(t, func(t *gtest.T) {
  1315  		result, err := db.Model(table).Where(g.Map{
  1316  			"passport like": "user_1%",
  1317  		}).Order("id asc").All()
  1318  		t.AssertNil(err)
  1319  		t.Assert(len(result), 2)
  1320  		t.Assert(result[0].GMap().Get("id"), 1)
  1321  		t.Assert(result[1].GMap().Get("id"), 10)
  1322  	})
  1323  	// map + slice parameter
  1324  	gtest.C(t, func(t *gtest.T) {
  1325  		result, err := db.Model(table).Where(g.Map{
  1326  			"id":       g.Slice{1, 2, 3},
  1327  			"passport": g.Slice{"user_2", "user_3"},
  1328  		}).And("id=? and nickname=?", g.Slice{3, "name_3"}).One()
  1329  		t.AssertNil(err)
  1330  		t.AssertGT(len(result), 0)
  1331  		t.Assert(result["id"].Int(), 3)
  1332  	})
  1333  	gtest.C(t, func(t *gtest.T) {
  1334  		result, err := db.Model(table).Where("id=3", g.Slice{}).One()
  1335  		t.AssertNil(err)
  1336  		t.AssertGT(len(result), 0)
  1337  		t.Assert(result["id"].Int(), 3)
  1338  	})
  1339  	gtest.C(t, func(t *gtest.T) {
  1340  		result, err := db.Model(table).Where("id=?", g.Slice{3}).One()
  1341  		t.AssertNil(err)
  1342  		t.AssertGT(len(result), 0)
  1343  		t.Assert(result["id"].Int(), 3)
  1344  	})
  1345  	gtest.C(t, func(t *gtest.T) {
  1346  		result, err := db.Model(table).Where("id", 3).One()
  1347  		t.AssertNil(err)
  1348  		t.AssertGT(len(result), 0)
  1349  		t.Assert(result["id"].Int(), 3)
  1350  	})
  1351  	gtest.C(t, func(t *gtest.T) {
  1352  		result, err := db.Model(table).Where("id", 3).Where("nickname", "name_3").One()
  1353  		t.AssertNil(err)
  1354  		t.Assert(result["id"].Int(), 3)
  1355  	})
  1356  	gtest.C(t, func(t *gtest.T) {
  1357  		result, err := db.Model(table).Where("id", 3).And("nickname", "name_3").One()
  1358  		t.AssertNil(err)
  1359  		t.Assert(result["id"].Int(), 3)
  1360  	})
  1361  	gtest.C(t, func(t *gtest.T) {
  1362  		result, err := db.Model(table).Where("id", 30).Or("nickname", "name_3").One()
  1363  		t.AssertNil(err)
  1364  		t.Assert(result["id"].Int(), 3)
  1365  	})
  1366  	gtest.C(t, func(t *gtest.T) {
  1367  		result, err := db.Model(table).Where("id", 30).Or("nickname", "name_3").And("id>?", 1).One()
  1368  		t.AssertNil(err)
  1369  		t.Assert(result["id"].Int(), 3)
  1370  	})
  1371  	gtest.C(t, func(t *gtest.T) {
  1372  		result, err := db.Model(table).Where("id", 30).Or("nickname", "name_3").And("id>", 1).One()
  1373  		t.AssertNil(err)
  1374  		t.Assert(result["id"].Int(), 3)
  1375  	})
  1376  	// slice
  1377  	gtest.C(t, func(t *gtest.T) {
  1378  		result, err := db.Model(table).Where("id=? AND nickname=?", g.Slice{3, "name_3"}...).One()
  1379  		t.AssertNil(err)
  1380  		t.Assert(result["id"].Int(), 3)
  1381  	})
  1382  	gtest.C(t, func(t *gtest.T) {
  1383  		result, err := db.Model(table).Where("id=? AND nickname=?", g.Slice{3, "name_3"}).One()
  1384  		t.AssertNil(err)
  1385  		t.Assert(result["id"].Int(), 3)
  1386  	})
  1387  	gtest.C(t, func(t *gtest.T) {
  1388  		result, err := db.Model(table).Where("passport like ? and nickname like ?", g.Slice{"user_3", "name_3"}).One()
  1389  		t.AssertNil(err)
  1390  		t.Assert(result["id"].Int(), 3)
  1391  	})
  1392  	// map
  1393  	gtest.C(t, func(t *gtest.T) {
  1394  		result, err := db.Model(table).Where(g.Map{"id": 3, "nickname": "name_3"}).One()
  1395  		t.AssertNil(err)
  1396  		t.Assert(result["id"].Int(), 3)
  1397  	})
  1398  	// map key operator
  1399  	gtest.C(t, func(t *gtest.T) {
  1400  		result, err := db.Model(table).Where(g.Map{"id>": 1, "id<": 3}).One()
  1401  		t.AssertNil(err)
  1402  		t.Assert(result["id"].Int(), 2)
  1403  	})
  1404  
  1405  	// gmap.Map
  1406  	gtest.C(t, func(t *gtest.T) {
  1407  		result, err := db.Model(table).Where(gmap.NewFrom(g.MapAnyAny{"id": 3, "nickname": "name_3"})).One()
  1408  		t.AssertNil(err)
  1409  		t.Assert(result["id"].Int(), 3)
  1410  	})
  1411  	// gmap.Map key operator
  1412  	gtest.C(t, func(t *gtest.T) {
  1413  		result, err := db.Model(table).Where(gmap.NewFrom(g.MapAnyAny{"id>": 1, "id<": 3})).One()
  1414  		t.AssertNil(err)
  1415  		t.Assert(result["id"].Int(), 2)
  1416  	})
  1417  
  1418  	// list map
  1419  	gtest.C(t, func(t *gtest.T) {
  1420  		result, err := db.Model(table).Where(gmap.NewListMapFrom(g.MapAnyAny{"id": 3, "nickname": "name_3"})).One()
  1421  		t.AssertNil(err)
  1422  		t.Assert(result["id"].Int(), 3)
  1423  	})
  1424  	// list map key operator
  1425  	gtest.C(t, func(t *gtest.T) {
  1426  		result, err := db.Model(table).Where(gmap.NewListMapFrom(g.MapAnyAny{"id>": 1, "id<": 3})).One()
  1427  		t.AssertNil(err)
  1428  		t.Assert(result["id"].Int(), 2)
  1429  	})
  1430  
  1431  	// tree map
  1432  	gtest.C(t, func(t *gtest.T) {
  1433  		result, err := db.Model(table).Where(gmap.NewTreeMapFrom(gutil.ComparatorString, g.MapAnyAny{"id": 3, "nickname": "name_3"})).One()
  1434  		t.AssertNil(err)
  1435  		t.Assert(result["id"].Int(), 3)
  1436  	})
  1437  	// tree map key operator
  1438  	gtest.C(t, func(t *gtest.T) {
  1439  		result, err := db.Model(table).Where(gmap.NewTreeMapFrom(gutil.ComparatorString, g.MapAnyAny{"id>": 1, "id<": 3})).One()
  1440  		t.AssertNil(err)
  1441  		t.Assert(result["id"].Int(), 2)
  1442  	})
  1443  
  1444  	// complicated where 1
  1445  	gtest.C(t, func(t *gtest.T) {
  1446  		//db.SetDebug(true)
  1447  		conditions := g.Map{
  1448  			"nickname like ?":    "%name%",
  1449  			"id between ? and ?": g.Slice{1, 3},
  1450  			"id > 0":             nil,
  1451  			"create_time > 0":    nil,
  1452  			"id":                 g.Slice{1, 2, 3},
  1453  		}
  1454  		result, err := db.Model(table).Where(conditions).Order("id asc").All()
  1455  		t.AssertNil(err)
  1456  		t.Assert(len(result), 3)
  1457  		t.Assert(result[0]["id"].Int(), 1)
  1458  	})
  1459  	// complicated where 2
  1460  	gtest.C(t, func(t *gtest.T) {
  1461  		//db.SetDebug(true)
  1462  		conditions := g.Map{
  1463  			"nickname like ?":    "%name%",
  1464  			"id between ? and ?": g.Slice{1, 3},
  1465  			"id >= ?":            1,
  1466  			"create_time > ?":    0,
  1467  			"id in(?)":           g.Slice{1, 2, 3},
  1468  		}
  1469  		result, err := db.Model(table).Where(conditions).Order("id asc").All()
  1470  		t.AssertNil(err)
  1471  		t.Assert(len(result), 3)
  1472  		t.Assert(result[0]["id"].Int(), 1)
  1473  	})
  1474  	// struct, automatic mapping and filtering.
  1475  	gtest.C(t, func(t *gtest.T) {
  1476  		type User struct {
  1477  			Id       int
  1478  			Nickname string
  1479  		}
  1480  		result, err := db.Model(table).Where(User{3, "name_3"}).One()
  1481  		t.AssertNil(err)
  1482  		t.Assert(result["id"].Int(), 3)
  1483  
  1484  		result, err = db.Model(table).Where(&User{3, "name_3"}).One()
  1485  		t.AssertNil(err)
  1486  		t.Assert(result["id"].Int(), 3)
  1487  	})
  1488  	// slice single
  1489  	gtest.C(t, func(t *gtest.T) {
  1490  		result, err := db.Model(table).Where("id IN(?)", g.Slice{1, 3}).Order("id ASC").All()
  1491  		t.AssertNil(err)
  1492  		t.Assert(len(result), 2)
  1493  		t.Assert(result[0]["id"].Int(), 1)
  1494  		t.Assert(result[1]["id"].Int(), 3)
  1495  	})
  1496  	// slice + string
  1497  	gtest.C(t, func(t *gtest.T) {
  1498  		result, err := db.Model(table).Where("nickname=? AND id IN(?)", "name_3", g.Slice{1, 3}).Order("id ASC").All()
  1499  		t.AssertNil(err)
  1500  		t.Assert(len(result), 1)
  1501  		t.Assert(result[0]["id"].Int(), 3)
  1502  	})
  1503  	// slice + map
  1504  	gtest.C(t, func(t *gtest.T) {
  1505  		result, err := db.Model(table).Where(g.Map{
  1506  			"id":       g.Slice{1, 3},
  1507  			"nickname": "name_3",
  1508  		}).Order("id ASC").All()
  1509  		t.AssertNil(err)
  1510  		t.Assert(len(result), 1)
  1511  		t.Assert(result[0]["id"].Int(), 3)
  1512  	})
  1513  	// slice + struct
  1514  	gtest.C(t, func(t *gtest.T) {
  1515  		type User struct {
  1516  			Ids      []int  `json:"id"`
  1517  			Nickname string `gconv:"nickname"`
  1518  		}
  1519  		result, err := db.Model(table).Where(User{
  1520  			Ids:      []int{1, 3},
  1521  			Nickname: "name_3",
  1522  		}).Order("id ASC").All()
  1523  		t.AssertNil(err)
  1524  		t.Assert(len(result), 1)
  1525  		t.Assert(result[0]["id"].Int(), 3)
  1526  	})
  1527  }
  1528  
  1529  func Test_Model_Where_ISNULL_1(t *testing.T) {
  1530  	table := createInitTable()
  1531  	defer dropTable(table)
  1532  
  1533  	gtest.C(t, func(t *gtest.T) {
  1534  		//db.SetDebug(true)
  1535  		result, err := db.Model(table).Data("nickname", nil).Where("id", 2).Update()
  1536  		t.AssertNil(err)
  1537  		n, _ := result.RowsAffected()
  1538  		t.Assert(n, 1)
  1539  
  1540  		one, err := db.Model(table).Where("nickname", nil).One()
  1541  		t.AssertNil(err)
  1542  		t.Assert(one.IsEmpty(), false)
  1543  		t.Assert(one["id"], 2)
  1544  	})
  1545  }
  1546  
  1547  func Test_Model_Where_ISNULL_2(t *testing.T) {
  1548  	table := createInitTable()
  1549  	defer dropTable(table)
  1550  
  1551  	// complicated one.
  1552  	gtest.C(t, func(t *gtest.T) {
  1553  		//db.SetDebug(true)
  1554  		conditions := g.Map{
  1555  			"nickname like ?":    "%name%",
  1556  			"id between ? and ?": g.Slice{1, 3},
  1557  			"id > 0":             nil,
  1558  			"create_time > 0":    nil,
  1559  			"id":                 g.Slice{1, 2, 3},
  1560  		}
  1561  		result, err := db.Model(table).WherePri(conditions).Order("id asc").All()
  1562  		t.AssertNil(err)
  1563  		t.Assert(len(result), 3)
  1564  		t.Assert(result[0]["id"].Int(), 1)
  1565  	})
  1566  }
  1567  
  1568  func Test_Model_Where_OmitEmpty(t *testing.T) {
  1569  	table := createInitTable()
  1570  	defer dropTable(table)
  1571  	gtest.C(t, func(t *gtest.T) {
  1572  		conditions := g.Map{
  1573  			"id < 4": "",
  1574  		}
  1575  		result, err := db.Model(table).WherePri(conditions).Order("id asc").All()
  1576  		t.AssertNil(err)
  1577  		t.Assert(len(result), 3)
  1578  		t.Assert(result[0]["id"].Int(), 1)
  1579  	})
  1580  	gtest.C(t, func(t *gtest.T) {
  1581  		conditions := g.Map{
  1582  			"id < 4": "",
  1583  		}
  1584  		result, err := db.Model(table).WherePri(conditions).OmitEmpty().Order("id asc").All()
  1585  		t.AssertNil(err)
  1586  		t.Assert(len(result), 3)
  1587  		t.Assert(result[0]["id"].Int(), 1)
  1588  	})
  1589  }
  1590  
  1591  func Test_Model_Where_GTime(t *testing.T) {
  1592  	table := createInitTable()
  1593  	defer dropTable(table)
  1594  
  1595  	gtest.C(t, func(t *gtest.T) {
  1596  		result, err := db.Model(table).Where("create_time>?", gtime.NewFromStr("2010-09-01")).All()
  1597  		t.AssertNil(err)
  1598  		t.Assert(len(result), 10)
  1599  	})
  1600  	gtest.C(t, func(t *gtest.T) {
  1601  		result, err := db.Model(table).Where("create_time>?", *gtime.NewFromStr("2010-09-01")).All()
  1602  		t.AssertNil(err)
  1603  		t.Assert(len(result), 10)
  1604  	})
  1605  }
  1606  
  1607  func Test_Model_WherePri(t *testing.T) {
  1608  	table := createInitTable()
  1609  	defer dropTable(table)
  1610  
  1611  	// primary key
  1612  	gtest.C(t, func(t *gtest.T) {
  1613  		one, err := db.Model(table).WherePri(3).One()
  1614  		t.AssertNil(err)
  1615  		t.AssertNE(one, nil)
  1616  		t.Assert(one["id"].Int(), 3)
  1617  	})
  1618  	gtest.C(t, func(t *gtest.T) {
  1619  		all, err := db.Model(table).WherePri(g.Slice{3, 9}).Order("id asc").All()
  1620  		t.AssertNil(err)
  1621  		t.Assert(len(all), 2)
  1622  		t.Assert(all[0]["id"].Int(), 3)
  1623  		t.Assert(all[1]["id"].Int(), 9)
  1624  	})
  1625  
  1626  	// string
  1627  	gtest.C(t, func(t *gtest.T) {
  1628  		result, err := db.Model(table).WherePri("id=? and nickname=?", 3, "name_3").One()
  1629  		t.AssertNil(err)
  1630  		t.AssertGT(len(result), 0)
  1631  		t.Assert(result["id"].Int(), 3)
  1632  	})
  1633  	// slice parameter
  1634  	gtest.C(t, func(t *gtest.T) {
  1635  		result, err := db.Model(table).WherePri("id=? and nickname=?", g.Slice{3, "name_3"}).One()
  1636  		t.AssertNil(err)
  1637  		t.AssertGT(len(result), 0)
  1638  		t.Assert(result["id"].Int(), 3)
  1639  	})
  1640  	// map like
  1641  	gtest.C(t, func(t *gtest.T) {
  1642  		result, err := db.Model(table).WherePri(g.Map{
  1643  			"passport like": "user_1%",
  1644  		}).Order("id asc").All()
  1645  		t.AssertNil(err)
  1646  		t.Assert(len(result), 2)
  1647  		t.Assert(result[0].GMap().Get("id"), 1)
  1648  		t.Assert(result[1].GMap().Get("id"), 10)
  1649  	})
  1650  	// map + slice parameter
  1651  	gtest.C(t, func(t *gtest.T) {
  1652  		result, err := db.Model(table).WherePri(g.Map{
  1653  			"id":       g.Slice{1, 2, 3},
  1654  			"passport": g.Slice{"user_2", "user_3"},
  1655  		}).And("id=? and nickname=?", g.Slice{3, "name_3"}).One()
  1656  		t.AssertNil(err)
  1657  		t.AssertGT(len(result), 0)
  1658  		t.Assert(result["id"].Int(), 3)
  1659  	})
  1660  	gtest.C(t, func(t *gtest.T) {
  1661  		result, err := db.Model(table).WherePri(g.Map{
  1662  			"id":       g.Slice{1, 2, 3},
  1663  			"passport": g.Slice{"user_2", "user_3"},
  1664  		}).Or("nickname=?", g.Slice{"name_4"}).And("id", 3).One()
  1665  		t.AssertNil(err)
  1666  		t.AssertGT(len(result), 0)
  1667  		t.Assert(result["id"].Int(), 2)
  1668  	})
  1669  	gtest.C(t, func(t *gtest.T) {
  1670  		result, err := db.Model(table).WherePri("id=3", g.Slice{}).One()
  1671  		t.AssertNil(err)
  1672  		t.AssertGT(len(result), 0)
  1673  		t.Assert(result["id"].Int(), 3)
  1674  	})
  1675  	gtest.C(t, func(t *gtest.T) {
  1676  		result, err := db.Model(table).WherePri("id=?", g.Slice{3}).One()
  1677  		t.AssertNil(err)
  1678  		t.AssertGT(len(result), 0)
  1679  		t.Assert(result["id"].Int(), 3)
  1680  	})
  1681  	gtest.C(t, func(t *gtest.T) {
  1682  		result, err := db.Model(table).WherePri("id", 3).One()
  1683  		t.AssertNil(err)
  1684  		t.AssertGT(len(result), 0)
  1685  		t.Assert(result["id"].Int(), 3)
  1686  	})
  1687  	gtest.C(t, func(t *gtest.T) {
  1688  		result, err := db.Model(table).WherePri("id", 3).WherePri("nickname", "name_3").One()
  1689  		t.AssertNil(err)
  1690  		t.Assert(result["id"].Int(), 3)
  1691  	})
  1692  	gtest.C(t, func(t *gtest.T) {
  1693  		result, err := db.Model(table).WherePri("id", 3).And("nickname", "name_3").One()
  1694  		t.AssertNil(err)
  1695  		t.Assert(result["id"].Int(), 3)
  1696  	})
  1697  	gtest.C(t, func(t *gtest.T) {
  1698  		result, err := db.Model(table).WherePri("id", 30).Or("nickname", "name_3").One()
  1699  		t.AssertNil(err)
  1700  		t.Assert(result["id"].Int(), 3)
  1701  	})
  1702  	gtest.C(t, func(t *gtest.T) {
  1703  		result, err := db.Model(table).WherePri("id", 30).Or("nickname", "name_3").And("id>?", 1).One()
  1704  		t.AssertNil(err)
  1705  		t.Assert(result["id"].Int(), 3)
  1706  	})
  1707  	gtest.C(t, func(t *gtest.T) {
  1708  		result, err := db.Model(table).WherePri("id", 30).Or("nickname", "name_3").And("id>", 1).One()
  1709  		t.AssertNil(err)
  1710  		t.Assert(result["id"].Int(), 3)
  1711  	})
  1712  	// slice
  1713  	gtest.C(t, func(t *gtest.T) {
  1714  		result, err := db.Model(table).WherePri("id=? AND nickname=?", g.Slice{3, "name_3"}...).One()
  1715  		t.AssertNil(err)
  1716  		t.Assert(result["id"].Int(), 3)
  1717  	})
  1718  	gtest.C(t, func(t *gtest.T) {
  1719  		result, err := db.Model(table).WherePri("id=? AND nickname=?", g.Slice{3, "name_3"}).One()
  1720  		t.AssertNil(err)
  1721  		t.Assert(result["id"].Int(), 3)
  1722  	})
  1723  	gtest.C(t, func(t *gtest.T) {
  1724  		result, err := db.Model(table).WherePri("passport like ? and nickname like ?", g.Slice{"user_3", "name_3"}).One()
  1725  		t.AssertNil(err)
  1726  		t.Assert(result["id"].Int(), 3)
  1727  	})
  1728  	// map
  1729  	gtest.C(t, func(t *gtest.T) {
  1730  		result, err := db.Model(table).WherePri(g.Map{"id": 3, "nickname": "name_3"}).One()
  1731  		t.AssertNil(err)
  1732  		t.Assert(result["id"].Int(), 3)
  1733  	})
  1734  	// map key operator
  1735  	gtest.C(t, func(t *gtest.T) {
  1736  		result, err := db.Model(table).WherePri(g.Map{"id>": 1, "id<": 3}).One()
  1737  		t.AssertNil(err)
  1738  		t.Assert(result["id"].Int(), 2)
  1739  	})
  1740  
  1741  	// gmap.Map
  1742  	gtest.C(t, func(t *gtest.T) {
  1743  		result, err := db.Model(table).WherePri(gmap.NewFrom(g.MapAnyAny{"id": 3, "nickname": "name_3"})).One()
  1744  		t.AssertNil(err)
  1745  		t.Assert(result["id"].Int(), 3)
  1746  	})
  1747  	// gmap.Map key operator
  1748  	gtest.C(t, func(t *gtest.T) {
  1749  		result, err := db.Model(table).WherePri(gmap.NewFrom(g.MapAnyAny{"id>": 1, "id<": 3})).One()
  1750  		t.AssertNil(err)
  1751  		t.Assert(result["id"].Int(), 2)
  1752  	})
  1753  
  1754  	// list map
  1755  	gtest.C(t, func(t *gtest.T) {
  1756  		result, err := db.Model(table).WherePri(gmap.NewListMapFrom(g.MapAnyAny{"id": 3, "nickname": "name_3"})).One()
  1757  		t.AssertNil(err)
  1758  		t.Assert(result["id"].Int(), 3)
  1759  	})
  1760  	// list map key operator
  1761  	gtest.C(t, func(t *gtest.T) {
  1762  		result, err := db.Model(table).WherePri(gmap.NewListMapFrom(g.MapAnyAny{"id>": 1, "id<": 3})).One()
  1763  		t.AssertNil(err)
  1764  		t.Assert(result["id"].Int(), 2)
  1765  	})
  1766  
  1767  	// tree map
  1768  	gtest.C(t, func(t *gtest.T) {
  1769  		result, err := db.Model(table).WherePri(gmap.NewTreeMapFrom(gutil.ComparatorString, g.MapAnyAny{"id": 3, "nickname": "name_3"})).One()
  1770  		t.AssertNil(err)
  1771  		t.Assert(result["id"].Int(), 3)
  1772  	})
  1773  	// tree map key operator
  1774  	gtest.C(t, func(t *gtest.T) {
  1775  		result, err := db.Model(table).WherePri(gmap.NewTreeMapFrom(gutil.ComparatorString, g.MapAnyAny{"id>": 1, "id<": 3})).One()
  1776  		t.AssertNil(err)
  1777  		t.Assert(result["id"].Int(), 2)
  1778  	})
  1779  
  1780  	// complicated where 1
  1781  	gtest.C(t, func(t *gtest.T) {
  1782  		//db.SetDebug(true)
  1783  		conditions := g.Map{
  1784  			"nickname like ?":    "%name%",
  1785  			"id between ? and ?": g.Slice{1, 3},
  1786  			"id > 0":             nil,
  1787  			"create_time > 0":    nil,
  1788  			"id":                 g.Slice{1, 2, 3},
  1789  		}
  1790  		result, err := db.Model(table).WherePri(conditions).Order("id asc").All()
  1791  		t.AssertNil(err)
  1792  		t.Assert(len(result), 3)
  1793  		t.Assert(result[0]["id"].Int(), 1)
  1794  	})
  1795  	// complicated where 2
  1796  	gtest.C(t, func(t *gtest.T) {
  1797  		//db.SetDebug(true)
  1798  		conditions := g.Map{
  1799  			"nickname like ?":    "%name%",
  1800  			"id between ? and ?": g.Slice{1, 3},
  1801  			"id >= ?":            1,
  1802  			"create_time > ?":    0,
  1803  			"id in(?)":           g.Slice{1, 2, 3},
  1804  		}
  1805  		result, err := db.Model(table).WherePri(conditions).Order("id asc").All()
  1806  		t.AssertNil(err)
  1807  		t.Assert(len(result), 3)
  1808  		t.Assert(result[0]["id"].Int(), 1)
  1809  	})
  1810  	// struct
  1811  	gtest.C(t, func(t *gtest.T) {
  1812  		type User struct {
  1813  			Id       int    `json:"id"`
  1814  			Nickname string `gconv:"nickname"`
  1815  		}
  1816  		result, err := db.Model(table).WherePri(User{3, "name_3"}).One()
  1817  		t.AssertNil(err)
  1818  		t.Assert(result["id"].Int(), 3)
  1819  
  1820  		result, err = db.Model(table).WherePri(&User{3, "name_3"}).One()
  1821  		t.AssertNil(err)
  1822  		t.Assert(result["id"].Int(), 3)
  1823  	})
  1824  	// slice single
  1825  	gtest.C(t, func(t *gtest.T) {
  1826  		result, err := db.Model(table).WherePri("id IN(?)", g.Slice{1, 3}).Order("id ASC").All()
  1827  		t.AssertNil(err)
  1828  		t.Assert(len(result), 2)
  1829  		t.Assert(result[0]["id"].Int(), 1)
  1830  		t.Assert(result[1]["id"].Int(), 3)
  1831  	})
  1832  	// slice + string
  1833  	gtest.C(t, func(t *gtest.T) {
  1834  		result, err := db.Model(table).WherePri("nickname=? AND id IN(?)", "name_3", g.Slice{1, 3}).Order("id ASC").All()
  1835  		t.AssertNil(err)
  1836  		t.Assert(len(result), 1)
  1837  		t.Assert(result[0]["id"].Int(), 3)
  1838  	})
  1839  	// slice + map
  1840  	gtest.C(t, func(t *gtest.T) {
  1841  		result, err := db.Model(table).WherePri(g.Map{
  1842  			"id":       g.Slice{1, 3},
  1843  			"nickname": "name_3",
  1844  		}).Order("id ASC").All()
  1845  		t.AssertNil(err)
  1846  		t.Assert(len(result), 1)
  1847  		t.Assert(result[0]["id"].Int(), 3)
  1848  	})
  1849  	// slice + struct
  1850  	gtest.C(t, func(t *gtest.T) {
  1851  		type User struct {
  1852  			Ids      []int  `json:"id"`
  1853  			Nickname string `gconv:"nickname"`
  1854  		}
  1855  		result, err := db.Model(table).WherePri(User{
  1856  			Ids:      []int{1, 3},
  1857  			Nickname: "name_3",
  1858  		}).Order("id ASC").All()
  1859  		t.AssertNil(err)
  1860  		t.Assert(len(result), 1)
  1861  		t.Assert(result[0]["id"].Int(), 3)
  1862  	})
  1863  }
  1864  
  1865  func Test_Model_Delete(t *testing.T) {
  1866  	table := createInitTable()
  1867  	defer dropTable(table)
  1868  
  1869  	// DELETE...LIMIT
  1870  	gtest.C(t, func(t *gtest.T) {
  1871  		result, err := db.Model(table).Where(1).Limit(2).Delete()
  1872  		t.AssertNil(err)
  1873  		n, _ := result.RowsAffected()
  1874  		t.Assert(n, 2)
  1875  	})
  1876  
  1877  	gtest.C(t, func(t *gtest.T) {
  1878  		result, err := db.Model(table).Where(1).Delete()
  1879  		t.AssertNil(err)
  1880  		n, _ := result.RowsAffected()
  1881  		t.Assert(n, TableSize-2)
  1882  	})
  1883  }
  1884  
  1885  func Test_Model_Offset(t *testing.T) {
  1886  	table := createInitTable()
  1887  	defer dropTable(table)
  1888  	gtest.C(t, func(t *gtest.T) {
  1889  		result, err := db.Model(table).Limit(2).Offset(5).Order("id").Select()
  1890  		t.AssertNil(err)
  1891  		t.Assert(len(result), 2)
  1892  		t.Assert(result[0]["id"], 6)
  1893  		t.Assert(result[1]["id"], 7)
  1894  	})
  1895  }
  1896  
  1897  func Test_Model_Page(t *testing.T) {
  1898  	table := createInitTable()
  1899  	defer dropTable(table)
  1900  	gtest.C(t, func(t *gtest.T) {
  1901  		result, err := db.Model(table).Page(3, 3).Order("id").All()
  1902  		t.AssertNil(err)
  1903  		t.Assert(len(result), 3)
  1904  		t.Assert(result[0]["id"], 7)
  1905  		t.Assert(result[1]["id"], 8)
  1906  	})
  1907  	gtest.C(t, func(t *gtest.T) {
  1908  		model := db.Model(table).Safe().Order("id")
  1909  		all, err := model.Page(3, 3).All()
  1910  		count, err := model.Count()
  1911  		t.AssertNil(err)
  1912  		t.Assert(len(all), 3)
  1913  		t.Assert(all[0]["id"], "7")
  1914  		t.Assert(count, TableSize)
  1915  	})
  1916  }
  1917  
  1918  func Test_Model_Option_Map(t *testing.T) {
  1919  	// Insert
  1920  	gtest.C(t, func(t *gtest.T) {
  1921  		table := createTable()
  1922  		defer dropTable(table)
  1923  		r, err := db.Model(table).Fields("id, passport").Data(g.Map{
  1924  			"id":       1,
  1925  			"passport": "1",
  1926  			"password": "1",
  1927  			"nickname": "1",
  1928  		}).Insert()
  1929  		t.AssertNil(err)
  1930  		n, _ := r.RowsAffected()
  1931  		t.Assert(n, 1)
  1932  		one, err := db.Model(table).Where("id", 1).One()
  1933  		t.AssertNil(err)
  1934  		t.AssertNE(one["password"].String(), "1")
  1935  		t.AssertNE(one["nickname"].String(), "1")
  1936  		t.Assert(one["passport"].String(), "1")
  1937  	})
  1938  	gtest.C(t, func(t *gtest.T) {
  1939  		table := createTable()
  1940  		defer dropTable(table)
  1941  		r, err := db.Model(table).OmitEmptyData().Data(g.Map{
  1942  			"id":       1,
  1943  			"passport": 0,
  1944  			"password": 0,
  1945  			"nickname": "1",
  1946  		}).Insert()
  1947  		t.AssertNil(err)
  1948  		n, _ := r.RowsAffected()
  1949  		t.Assert(n, 1)
  1950  		one, err := db.Model(table).Where("id", 1).One()
  1951  		t.AssertNil(err)
  1952  		t.AssertNE(one["passport"].String(), "0")
  1953  		t.AssertNE(one["password"].String(), "0")
  1954  		t.Assert(one["nickname"].String(), "1")
  1955  	})
  1956  
  1957  	// Replace
  1958  	gtest.C(t, func(t *gtest.T) {
  1959  		table := createInitTable()
  1960  		defer dropTable(table)
  1961  		_, err := db.Model(table).OmitEmptyData().Data(g.Map{
  1962  			"id":       1,
  1963  			"passport": 0,
  1964  			"password": 0,
  1965  			"nickname": "1",
  1966  		}).Replace()
  1967  		t.AssertNil(err)
  1968  		one, err := db.Model(table).Where("id", 1).One()
  1969  		t.AssertNil(err)
  1970  		t.AssertNE(one["passport"].String(), "0")
  1971  		t.AssertNE(one["password"].String(), "0")
  1972  		t.Assert(one["nickname"].String(), "1")
  1973  	})
  1974  
  1975  	// Save
  1976  	gtest.C(t, func(t *gtest.T) {
  1977  		table := createTable()
  1978  		defer dropTable(table)
  1979  		r, err := db.Model(table).Fields("id, passport").Data(g.Map{
  1980  			"id":       1,
  1981  			"passport": "1",
  1982  			"password": "1",
  1983  			"nickname": "1",
  1984  		}).Save()
  1985  		t.AssertNil(err)
  1986  		n, _ := r.RowsAffected()
  1987  		t.Assert(n, 1)
  1988  		one, err := db.Model(table).Where("id", 1).One()
  1989  		t.AssertNil(err)
  1990  		t.AssertNE(one["password"].String(), "1")
  1991  		t.AssertNE(one["nickname"].String(), "1")
  1992  		t.Assert(one["passport"].String(), "1")
  1993  	})
  1994  	gtest.C(t, func(t *gtest.T) {
  1995  		table := createTable()
  1996  		defer dropTable(table)
  1997  		_, err := db.Model(table).OmitEmptyData().Data(g.Map{
  1998  			"id":       1,
  1999  			"passport": 0,
  2000  			"password": 0,
  2001  			"nickname": "1",
  2002  		}).Save()
  2003  		t.AssertNil(err)
  2004  		one, err := db.Model(table).Where("id", 1).One()
  2005  		t.AssertNil(err)
  2006  		t.AssertNE(one["passport"].String(), "0")
  2007  		t.AssertNE(one["password"].String(), "0")
  2008  		t.Assert(one["nickname"].String(), "1")
  2009  
  2010  		_, err = db.Model(table).Data(g.Map{
  2011  			"id":       1,
  2012  			"passport": 0,
  2013  			"password": 0,
  2014  			"nickname": "1",
  2015  		}).Save()
  2016  		t.AssertNil(err)
  2017  		one, err = db.Model(table).Where("id", 1).One()
  2018  		t.AssertNil(err)
  2019  		t.Assert(one["passport"].String(), "0")
  2020  		t.Assert(one["password"].String(), "0")
  2021  		t.Assert(one["nickname"].String(), "1")
  2022  	})
  2023  
  2024  	// Update
  2025  	gtest.C(t, func(t *gtest.T) {
  2026  		table := createInitTable()
  2027  		defer dropTable(table)
  2028  
  2029  		r, err := db.Model(table).Data(g.Map{"nickname": ""}).Where("id", 1).Update()
  2030  		t.AssertNil(err)
  2031  		n, _ := r.RowsAffected()
  2032  		t.Assert(n, 1)
  2033  
  2034  		_, err = db.Model(table).OmitEmptyData().Data(g.Map{"nickname": ""}).Where("id", 2).Update()
  2035  		t.AssertNE(err, nil)
  2036  
  2037  		r, err = db.Model(table).OmitEmpty().Data(g.Map{"nickname": "", "password": "123"}).Where("id", 3).Update()
  2038  		t.AssertNil(err)
  2039  		n, _ = r.RowsAffected()
  2040  		t.Assert(n, 1)
  2041  
  2042  		_, err = db.Model(table).OmitEmpty().Fields("nickname").Data(g.Map{"nickname": "", "password": "123"}).Where("id", 4).Update()
  2043  		t.AssertNE(err, nil)
  2044  
  2045  		r, err = db.Model(table).OmitEmpty().
  2046  			Fields("password").Data(g.Map{
  2047  			"nickname": "",
  2048  			"passport": "123",
  2049  			"password": "456",
  2050  		}).Where("id", 5).Update()
  2051  		t.AssertNil(err)
  2052  		n, _ = r.RowsAffected()
  2053  		t.Assert(n, 1)
  2054  
  2055  		one, err := db.Model(table).Where("id", 5).One()
  2056  		t.AssertNil(err)
  2057  		t.Assert(one["password"], "456")
  2058  		t.AssertNE(one["passport"].String(), "")
  2059  		t.AssertNE(one["passport"].String(), "123")
  2060  	})
  2061  }
  2062  
  2063  func Test_Model_Option_List(t *testing.T) {
  2064  	gtest.C(t, func(t *gtest.T) {
  2065  		table := createTable()
  2066  		defer dropTable(table)
  2067  		r, err := db.Model(table).Fields("id, password").Data(g.List{
  2068  			g.Map{
  2069  				"id":       1,
  2070  				"passport": "1",
  2071  				"password": "1",
  2072  				"nickname": "1",
  2073  			},
  2074  			g.Map{
  2075  				"id":       2,
  2076  				"passport": "2",
  2077  				"password": "2",
  2078  				"nickname": "2",
  2079  			},
  2080  		}).Save()
  2081  		t.AssertNil(err)
  2082  		n, _ := r.RowsAffected()
  2083  		t.Assert(n, 2)
  2084  		list, err := db.Model(table).Order("id asc").All()
  2085  		t.AssertNil(err)
  2086  		t.Assert(len(list), 2)
  2087  		t.Assert(list[0]["id"].String(), "1")
  2088  		t.Assert(list[0]["nickname"].String(), "")
  2089  		t.Assert(list[0]["passport"].String(), "")
  2090  		t.Assert(list[0]["password"].String(), "1")
  2091  
  2092  		t.Assert(list[1]["id"].String(), "2")
  2093  		t.Assert(list[1]["nickname"].String(), "")
  2094  		t.Assert(list[1]["passport"].String(), "")
  2095  		t.Assert(list[1]["password"].String(), "2")
  2096  	})
  2097  
  2098  	gtest.C(t, func(t *gtest.T) {
  2099  		table := createTable()
  2100  		defer dropTable(table)
  2101  		r, err := db.Model(table).OmitEmpty().Fields("id, password").Data(g.List{
  2102  			g.Map{
  2103  				"id":       1,
  2104  				"passport": "1",
  2105  				"password": 0,
  2106  				"nickname": "1",
  2107  			},
  2108  			g.Map{
  2109  				"id":       2,
  2110  				"passport": "2",
  2111  				"password": "2",
  2112  				"nickname": "2",
  2113  			},
  2114  		}).Save()
  2115  		t.AssertNil(err)
  2116  		n, _ := r.RowsAffected()
  2117  		t.Assert(n, 2)
  2118  		list, err := db.Model(table).Order("id asc").All()
  2119  		t.AssertNil(err)
  2120  		t.Assert(len(list), 2)
  2121  		t.Assert(list[0]["id"].String(), "1")
  2122  		t.Assert(list[0]["nickname"].String(), "")
  2123  		t.Assert(list[0]["passport"].String(), "")
  2124  		t.Assert(list[0]["password"].String(), "0")
  2125  
  2126  		t.Assert(list[1]["id"].String(), "2")
  2127  		t.Assert(list[1]["nickname"].String(), "")
  2128  		t.Assert(list[1]["passport"].String(), "")
  2129  		t.Assert(list[1]["password"].String(), "2")
  2130  
  2131  	})
  2132  }
  2133  
  2134  func Test_Model_OmitEmpty(t *testing.T) {
  2135  	table := fmt.Sprintf(`table_%s`, gtime.TimestampNanoStr())
  2136  	if _, err := db.Exec(fmt.Sprintf(`
  2137      CREATE TABLE IF NOT EXISTS %s (
  2138          id int(10) unsigned NOT NULL AUTO_INCREMENT,
  2139          name varchar(45) NOT NULL,
  2140          PRIMARY KEY (id)
  2141      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  2142      `, table)); err != nil {
  2143  		gtest.Error(err)
  2144  	}
  2145  	defer dropTable(table)
  2146  
  2147  	gtest.C(t, func(t *gtest.T) {
  2148  		_, err := db.Model(table).OmitEmpty().Data(g.Map{
  2149  			"id":   1,
  2150  			"name": "",
  2151  		}).Save()
  2152  		t.AssertNE(err, nil)
  2153  	})
  2154  	gtest.C(t, func(t *gtest.T) {
  2155  		_, err := db.Model(table).OmitEmptyData().Data(g.Map{
  2156  			"id":   1,
  2157  			"name": "",
  2158  		}).Save()
  2159  		t.AssertNE(err, nil)
  2160  	})
  2161  	gtest.C(t, func(t *gtest.T) {
  2162  		_, err := db.Model(table).OmitEmptyWhere().Data(g.Map{
  2163  			"id":   1,
  2164  			"name": "",
  2165  		}).Save()
  2166  		t.Assert(err, nil)
  2167  	})
  2168  }
  2169  
  2170  func Test_Model_OmitNil(t *testing.T) {
  2171  	table := fmt.Sprintf(`table_%s`, gtime.TimestampNanoStr())
  2172  	if _, err := db.Exec(fmt.Sprintf(`
  2173      CREATE TABLE IF NOT EXISTS %s (
  2174          id int(10) unsigned NOT NULL AUTO_INCREMENT,
  2175          name varchar(45) NOT NULL,
  2176          PRIMARY KEY (id)
  2177      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  2178      `, table)); err != nil {
  2179  		gtest.Error(err)
  2180  	}
  2181  	defer dropTable(table)
  2182  
  2183  	gtest.C(t, func(t *gtest.T) {
  2184  		_, err := db.Model(table).OmitNil().Data(g.Map{
  2185  			"id":   1,
  2186  			"name": nil,
  2187  		}).Save()
  2188  		t.AssertNE(err, nil)
  2189  	})
  2190  	gtest.C(t, func(t *gtest.T) {
  2191  		_, err := db.Model(table).OmitNil().Data(g.Map{
  2192  			"id":   1,
  2193  			"name": "",
  2194  		}).Save()
  2195  		t.Assert(err, nil)
  2196  	})
  2197  	gtest.C(t, func(t *gtest.T) {
  2198  		_, err := db.Model(table).OmitNilWhere().Data(g.Map{
  2199  			"id":   1,
  2200  			"name": "",
  2201  		}).Save()
  2202  		t.Assert(err, nil)
  2203  	})
  2204  }
  2205  
  2206  func Test_Model_Option_Where(t *testing.T) {
  2207  	gtest.C(t, func(t *gtest.T) {
  2208  		table := createInitTable()
  2209  		defer dropTable(table)
  2210  		r, err := db.Model(table).OmitEmpty().Data("nickname", 1).Where(g.Map{"id": 0, "passport": ""}).And(1).Update()
  2211  		t.AssertNil(err)
  2212  		n, _ := r.RowsAffected()
  2213  		t.Assert(n, TableSize)
  2214  	})
  2215  	gtest.C(t, func(t *gtest.T) {
  2216  		table := createInitTable()
  2217  		defer dropTable(table)
  2218  		r, err := db.Model(table).OmitEmpty().Data("nickname", 1).Where(g.Map{"id": 1, "passport": ""}).Update()
  2219  		t.AssertNil(err)
  2220  		n, _ := r.RowsAffected()
  2221  		t.Assert(n, 1)
  2222  
  2223  		v, err := db.Model(table).Where("id", 1).Fields("nickname").Value()
  2224  		t.AssertNil(err)
  2225  		t.Assert(v.String(), "1")
  2226  	})
  2227  }
  2228  
  2229  func Test_Model_Where_MultiSliceArguments(t *testing.T) {
  2230  	table := createInitTable()
  2231  	defer dropTable(table)
  2232  	gtest.C(t, func(t *gtest.T) {
  2233  		r, err := db.Model(table).Where(g.Map{
  2234  			"id":       g.Slice{1, 2, 3, 4},
  2235  			"passport": g.Slice{"user_2", "user_3", "user_4"},
  2236  			"nickname": g.Slice{"name_2", "name_4"},
  2237  			"id >= 4":  nil,
  2238  		}).All()
  2239  		t.AssertNil(err)
  2240  		t.Assert(len(r), 1)
  2241  		t.Assert(r[0]["id"], 4)
  2242  	})
  2243  
  2244  	gtest.C(t, func(t *gtest.T) {
  2245  		result, err := db.Model(table).Where(g.Map{
  2246  			"id":       g.Slice{1, 2, 3},
  2247  			"passport": g.Slice{"user_2", "user_3"},
  2248  		}).Or("nickname=?", g.Slice{"name_4"}).And("id", 3).One()
  2249  		t.AssertNil(err)
  2250  		t.AssertGT(len(result), 0)
  2251  		t.Assert(result["id"].Int(), 2)
  2252  	})
  2253  }
  2254  
  2255  func Test_Model_FieldsEx(t *testing.T) {
  2256  	table := createInitTable()
  2257  	defer dropTable(table)
  2258  	// Select.
  2259  	gtest.C(t, func(t *gtest.T) {
  2260  		r, err := db.Model(table).FieldsEx("create_time, id").Where("id in (?)", g.Slice{1, 2}).Order("id asc").All()
  2261  		t.AssertNil(err)
  2262  		t.Assert(len(r), 2)
  2263  		t.Assert(len(r[0]), 3)
  2264  		t.Assert(r[0]["id"], "")
  2265  		t.Assert(r[0]["passport"], "user_1")
  2266  		t.Assert(r[0]["password"], "pass_1")
  2267  		t.Assert(r[0]["nickname"], "name_1")
  2268  		t.Assert(r[0]["create_time"], "")
  2269  		t.Assert(r[1]["id"], "")
  2270  		t.Assert(r[1]["passport"], "user_2")
  2271  		t.Assert(r[1]["password"], "pass_2")
  2272  		t.Assert(r[1]["nickname"], "name_2")
  2273  		t.Assert(r[1]["create_time"], "")
  2274  	})
  2275  	// Update.
  2276  	gtest.C(t, func(t *gtest.T) {
  2277  		r, err := db.Model(table).FieldsEx("password").Data(g.Map{"nickname": "123", "password": "456"}).Where("id", 3).Update()
  2278  		t.AssertNil(err)
  2279  		n, _ := r.RowsAffected()
  2280  		t.Assert(n, 1)
  2281  
  2282  		one, err := db.Model(table).Where("id", 3).One()
  2283  		t.AssertNil(err)
  2284  		t.Assert(one["nickname"], "123")
  2285  		t.AssertNE(one["password"], "456")
  2286  	})
  2287  }
  2288  
  2289  func Test_Model_FieldsEx_WithReservedWords(t *testing.T) {
  2290  	table := "fieldsex_test_table"
  2291  	sqlTpcPath := gdebug.TestDataPath("reservedwords_table_tpl.sql")
  2292  	if _, err := db.Exec(fmt.Sprintf(gfile.GetContents(sqlTpcPath), table)); err != nil {
  2293  		gtest.Error(err)
  2294  	}
  2295  	defer dropTable(table)
  2296  	gtest.C(t, func(t *gtest.T) {
  2297  		_, err := db.Model(table).FieldsEx("content").One()
  2298  		t.AssertNil(err)
  2299  	})
  2300  }
  2301  
  2302  func Test_Model_FieldsStr(t *testing.T) {
  2303  	table := createTable()
  2304  	defer dropTable(table)
  2305  
  2306  	gtest.C(t, func(t *gtest.T) {
  2307  		t.Assert(db.Model(table).FieldsStr(), "`id`,`passport`,`password`,`nickname`,`create_time`")
  2308  		t.Assert(db.Model(table).FieldsStr("a."), "`a`.`id`,`a`.`passport`,`a`.`password`,`a`.`nickname`,`a`.`create_time`")
  2309  	})
  2310  }
  2311  
  2312  func Test_Model_FieldsExStr(t *testing.T) {
  2313  	table := createTable()
  2314  	defer dropTable(table)
  2315  
  2316  	gtest.C(t, func(t *gtest.T) {
  2317  		t.Assert(db.Model(table).FieldsExStr("create_time,nickname"), "`id`,`passport`,`password`")
  2318  		t.Assert(db.Model(table).FieldsExStr("create_time,nickname", "a."), "`a`.`id`,`a`.`passport`,`a`.`password`")
  2319  	})
  2320  }
  2321  
  2322  func Test_Model_Prefix(t *testing.T) {
  2323  	db := dbPrefix
  2324  	table := fmt.Sprintf(`%s_%d`, TableName, gtime.TimestampNano())
  2325  	createInitTableWithDb(db, TableNamePrefix1+table)
  2326  	defer dropTable(TableNamePrefix1 + table)
  2327  	// Select.
  2328  	gtest.C(t, func(t *gtest.T) {
  2329  		r, err := db.Model(table).Where("id in (?)", g.Slice{1, 2}).Order("id asc").All()
  2330  		t.AssertNil(err)
  2331  		t.Assert(len(r), 2)
  2332  		t.Assert(r[0]["id"], "1")
  2333  		t.Assert(r[1]["id"], "2")
  2334  	})
  2335  	// Select with alias.
  2336  	gtest.C(t, func(t *gtest.T) {
  2337  		r, err := db.Model(table+" as u").Where("u.id in (?)", g.Slice{1, 2}).Order("u.id asc").All()
  2338  		t.AssertNil(err)
  2339  		t.Assert(len(r), 2)
  2340  		t.Assert(r[0]["id"], "1")
  2341  		t.Assert(r[1]["id"], "2")
  2342  	})
  2343  	// Select with alias to struct.
  2344  	gtest.C(t, func(t *gtest.T) {
  2345  		type User struct {
  2346  			Id       int
  2347  			Passport string
  2348  			Password string
  2349  			NickName string
  2350  		}
  2351  		var users []User
  2352  		err := db.Model(table+" u").Where("u.id in (?)", g.Slice{1, 5}).Order("u.id asc").Scan(&users)
  2353  		t.AssertNil(err)
  2354  		t.Assert(len(users), 2)
  2355  		t.Assert(users[0].Id, 1)
  2356  		t.Assert(users[1].Id, 5)
  2357  	})
  2358  	// Select with alias and join statement.
  2359  	gtest.C(t, func(t *gtest.T) {
  2360  		r, err := db.Model(table+" as u1").LeftJoin(table+" as u2", "u2.id=u1.id").Where("u1.id in (?)", g.Slice{1, 2}).Order("u1.id asc").All()
  2361  		t.AssertNil(err)
  2362  		t.Assert(len(r), 2)
  2363  		t.Assert(r[0]["id"], "1")
  2364  		t.Assert(r[1]["id"], "2")
  2365  	})
  2366  	gtest.C(t, func(t *gtest.T) {
  2367  		r, err := db.Model(table).As("u1").LeftJoin(table+" as u2", "u2.id=u1.id").Where("u1.id in (?)", g.Slice{1, 2}).Order("u1.id asc").All()
  2368  		t.AssertNil(err)
  2369  		t.Assert(len(r), 2)
  2370  		t.Assert(r[0]["id"], "1")
  2371  		t.Assert(r[1]["id"], "2")
  2372  	})
  2373  }
  2374  
  2375  func Test_Model_Schema1(t *testing.T) {
  2376  	//db.SetDebug(true)
  2377  
  2378  	db.SetSchema(TestSchema1)
  2379  	table := fmt.Sprintf(`%s_%s`, TableName, gtime.TimestampNanoStr())
  2380  	createInitTableWithDb(db, table)
  2381  	db.SetSchema(TestSchema2)
  2382  	createInitTableWithDb(db, table)
  2383  	defer func() {
  2384  		db.SetSchema(TestSchema1)
  2385  		dropTableWithDb(db, table)
  2386  		db.SetSchema(TestSchema2)
  2387  		dropTableWithDb(db, table)
  2388  
  2389  		db.SetSchema(TestSchema1)
  2390  	}()
  2391  	// Method.
  2392  	gtest.C(t, func(t *gtest.T) {
  2393  		db.SetSchema(TestSchema1)
  2394  		r, err := db.Model(table).Update(g.Map{"nickname": "name_100"}, "id=1")
  2395  		t.AssertNil(err)
  2396  		n, _ := r.RowsAffected()
  2397  		t.Assert(n, 1)
  2398  
  2399  		v, err := db.Model(table).Value("nickname", "id=1")
  2400  		t.AssertNil(err)
  2401  		t.Assert(v.String(), "name_100")
  2402  
  2403  		db.SetSchema(TestSchema2)
  2404  		v, err = db.Model(table).Value("nickname", "id=1")
  2405  		t.AssertNil(err)
  2406  		t.Assert(v.String(), "name_1")
  2407  	})
  2408  	// Model.
  2409  	gtest.C(t, func(t *gtest.T) {
  2410  		v, err := db.Model(table).Schema(TestSchema1).Value("nickname", "id=2")
  2411  		t.AssertNil(err)
  2412  		t.Assert(v.String(), "name_2")
  2413  
  2414  		r, err := db.Model(table).Schema(TestSchema1).Update(g.Map{"nickname": "name_200"}, "id=2")
  2415  		t.AssertNil(err)
  2416  		n, _ := r.RowsAffected()
  2417  		t.Assert(n, 1)
  2418  
  2419  		v, err = db.Model(table).Schema(TestSchema1).Value("nickname", "id=2")
  2420  		t.AssertNil(err)
  2421  		t.Assert(v.String(), "name_200")
  2422  
  2423  		v, err = db.Model(table).Schema(TestSchema2).Value("nickname", "id=2")
  2424  		t.AssertNil(err)
  2425  		t.Assert(v.String(), "name_2")
  2426  
  2427  		v, err = db.Model(table).Schema(TestSchema1).Value("nickname", "id=2")
  2428  		t.AssertNil(err)
  2429  		t.Assert(v.String(), "name_200")
  2430  	})
  2431  	// Model.
  2432  	gtest.C(t, func(t *gtest.T) {
  2433  		i := 1000
  2434  		_, err := db.Model(table).Schema(TestSchema1).Insert(g.Map{
  2435  			"id":               i,
  2436  			"passport":         fmt.Sprintf(`user_%d`, i),
  2437  			"password":         fmt.Sprintf(`pass_%d`, i),
  2438  			"nickname":         fmt.Sprintf(`name_%d`, i),
  2439  			"create_time":      gtime.NewFromStr("2018-10-24 10:00:00").String(),
  2440  			"none-exist-field": 1,
  2441  		})
  2442  		t.AssertNil(err)
  2443  
  2444  		v, err := db.Model(table).Schema(TestSchema1).Value("nickname", "id=?", i)
  2445  		t.AssertNil(err)
  2446  		t.Assert(v.String(), "name_1000")
  2447  
  2448  		v, err = db.Model(table).Schema(TestSchema2).Value("nickname", "id=?", i)
  2449  		t.AssertNil(err)
  2450  		t.Assert(v.String(), "")
  2451  	})
  2452  }
  2453  
  2454  func Test_Model_Schema2(t *testing.T) {
  2455  	//db.SetDebug(true)
  2456  
  2457  	db.SetSchema(TestSchema1)
  2458  	table := fmt.Sprintf(`%s_%s`, TableName, gtime.TimestampNanoStr())
  2459  	createInitTableWithDb(db, table)
  2460  	db.SetSchema(TestSchema2)
  2461  	createInitTableWithDb(db, table)
  2462  	defer func() {
  2463  		db.SetSchema(TestSchema1)
  2464  		dropTableWithDb(db, table)
  2465  		db.SetSchema(TestSchema2)
  2466  		dropTableWithDb(db, table)
  2467  
  2468  		db.SetSchema(TestSchema1)
  2469  	}()
  2470  	// Schema.
  2471  	gtest.C(t, func(t *gtest.T) {
  2472  		v, err := db.Schema(TestSchema1).Table(table).Value("nickname", "id=2")
  2473  		t.AssertNil(err)
  2474  		t.Assert(v.String(), "name_2")
  2475  
  2476  		r, err := db.Schema(TestSchema1).Table(table).Update(g.Map{"nickname": "name_200"}, "id=2")
  2477  		t.AssertNil(err)
  2478  		n, _ := r.RowsAffected()
  2479  		t.Assert(n, 1)
  2480  
  2481  		v, err = db.Schema(TestSchema1).Table(table).Value("nickname", "id=2")
  2482  		t.AssertNil(err)
  2483  		t.Assert(v.String(), "name_200")
  2484  
  2485  		v, err = db.Schema(TestSchema2).Table(table).Value("nickname", "id=2")
  2486  		t.AssertNil(err)
  2487  		t.Assert(v.String(), "name_2")
  2488  
  2489  		v, err = db.Schema(TestSchema1).Table(table).Value("nickname", "id=2")
  2490  		t.AssertNil(err)
  2491  		t.Assert(v.String(), "name_200")
  2492  	})
  2493  	// Schema.
  2494  	gtest.C(t, func(t *gtest.T) {
  2495  		i := 1000
  2496  		_, err := db.Schema(TestSchema1).Table(table).Insert(g.Map{
  2497  			"id":               i,
  2498  			"passport":         fmt.Sprintf(`user_%d`, i),
  2499  			"password":         fmt.Sprintf(`pass_%d`, i),
  2500  			"nickname":         fmt.Sprintf(`name_%d`, i),
  2501  			"create_time":      gtime.NewFromStr("2018-10-24 10:00:00").String(),
  2502  			"none-exist-field": 1,
  2503  		})
  2504  		t.AssertNil(err)
  2505  
  2506  		v, err := db.Schema(TestSchema1).Table(table).Value("nickname", "id=?", i)
  2507  		t.AssertNil(err)
  2508  		t.Assert(v.String(), "name_1000")
  2509  
  2510  		v, err = db.Schema(TestSchema2).Table(table).Value("nickname", "id=?", i)
  2511  		t.AssertNil(err)
  2512  		t.Assert(v.String(), "")
  2513  	})
  2514  }
  2515  
  2516  func Test_Model_FieldsExStruct(t *testing.T) {
  2517  	table := createTable()
  2518  	defer dropTable(table)
  2519  	gtest.C(t, func(t *gtest.T) {
  2520  		type User struct {
  2521  			Id       int    `orm:"id"       json:"id"`
  2522  			Passport string `orm:"password" json:"pass_port"`
  2523  			Password string `orm:"password" json:"password"`
  2524  			NickName string `orm:"nickname" json:"nick__name"`
  2525  		}
  2526  		user := &User{
  2527  			Id:       1,
  2528  			Passport: "111",
  2529  			Password: "222",
  2530  			NickName: "333",
  2531  		}
  2532  		r, err := db.Model(table).FieldsEx("create_time, password").OmitEmpty().Data(user).Insert()
  2533  		t.AssertNil(err)
  2534  		n, err := r.RowsAffected()
  2535  		t.AssertNil(err)
  2536  		t.Assert(n, 1)
  2537  	})
  2538  	gtest.C(t, func(t *gtest.T) {
  2539  		type User struct {
  2540  			Id       int    `orm:"id"       json:"id"`
  2541  			Passport string `orm:"password" json:"pass_port"`
  2542  			Password string `orm:"password" json:"password"`
  2543  			NickName string `orm:"nickname" json:"nick__name"`
  2544  		}
  2545  		users := make([]*User, 0)
  2546  		for i := 100; i < 110; i++ {
  2547  			users = append(users, &User{
  2548  				Id:       i,
  2549  				Passport: fmt.Sprintf(`passport_%d`, i),
  2550  				Password: fmt.Sprintf(`password_%d`, i),
  2551  				NickName: fmt.Sprintf(`nickname_%d`, i),
  2552  			})
  2553  		}
  2554  		r, err := db.Model(table).FieldsEx("create_time, password").
  2555  			OmitEmpty().
  2556  			Batch(2).
  2557  			Data(users).
  2558  			Insert()
  2559  		t.AssertNil(err)
  2560  		n, err := r.RowsAffected()
  2561  		t.AssertNil(err)
  2562  		t.Assert(n, 10)
  2563  	})
  2564  }
  2565  
  2566  func Test_Model_OmitEmpty_Time(t *testing.T) {
  2567  	table := createInitTable()
  2568  	defer dropTable(table)
  2569  	gtest.C(t, func(t *gtest.T) {
  2570  		type User struct {
  2571  			Id       int       `orm:"id"       json:"id"`
  2572  			Passport string    `orm:"password" json:"pass_port"`
  2573  			Password string    `orm:"password" json:"password"`
  2574  			Time     time.Time `orm:"create_time" `
  2575  		}
  2576  		user := &User{
  2577  			Id:       1,
  2578  			Passport: "111",
  2579  			Password: "222",
  2580  			Time:     time.Time{},
  2581  		}
  2582  		r, err := db.Model(table).OmitEmpty().Data(user).WherePri(1).Update()
  2583  		t.AssertNil(err)
  2584  		n, err := r.RowsAffected()
  2585  		t.AssertNil(err)
  2586  		t.Assert(n, 1)
  2587  	})
  2588  }
  2589  
  2590  func Test_Result_Chunk(t *testing.T) {
  2591  	table := createInitTable()
  2592  	defer dropTable(table)
  2593  	gtest.C(t, func(t *gtest.T) {
  2594  		r, err := db.Model(table).Order("id asc").All()
  2595  		t.AssertNil(err)
  2596  		chunks := r.Chunk(3)
  2597  		t.Assert(len(chunks), 4)
  2598  		t.Assert(chunks[0][0]["id"].Int(), 1)
  2599  		t.Assert(chunks[1][0]["id"].Int(), 4)
  2600  		t.Assert(chunks[2][0]["id"].Int(), 7)
  2601  		t.Assert(chunks[3][0]["id"].Int(), 10)
  2602  	})
  2603  }
  2604  
  2605  func Test_Model_DryRun(t *testing.T) {
  2606  	table := createInitTable()
  2607  	defer dropTable(table)
  2608  	db.SetDryRun(true)
  2609  	defer db.SetDryRun(false)
  2610  
  2611  	gtest.C(t, func(t *gtest.T) {
  2612  		one, err := db.Model(table).FindOne(1)
  2613  		t.AssertNil(err)
  2614  		t.Assert(one["id"], 1)
  2615  	})
  2616  	gtest.C(t, func(t *gtest.T) {
  2617  		r, err := db.Model(table).Data("passport", "port_1").WherePri(1).Update()
  2618  		t.AssertNil(err)
  2619  		n, err := r.RowsAffected()
  2620  		t.AssertNil(err)
  2621  		t.Assert(n, 0)
  2622  	})
  2623  }
  2624  
  2625  func Test_Model_Join_SubQuery(t *testing.T) {
  2626  	table := createInitTable()
  2627  	defer dropTable(table)
  2628  	gtest.C(t, func(t *gtest.T) {
  2629  		subQuery := fmt.Sprintf("select * from `%s`", table)
  2630  		r, err := db.Model(table, "t1").Fields("t2.id").LeftJoin(subQuery, "t2", "t2.id=t1.id").Array()
  2631  		t.AssertNil(err)
  2632  		t.Assert(len(r), TableSize)
  2633  		t.Assert(r[0], "1")
  2634  		t.Assert(r[TableSize-1], TableSize)
  2635  	})
  2636  }
  2637  
  2638  func Test_Model_Cache(t *testing.T) {
  2639  	table := createInitTable()
  2640  	defer dropTable(table)
  2641  
  2642  	gtest.C(t, func(t *gtest.T) {
  2643  		one, err := db.Model(table).Cache(time.Second, "test1").FindOne(1)
  2644  		t.AssertNil(err)
  2645  		t.Assert(one["passport"], "user_1")
  2646  
  2647  		r, err := db.Model(table).Data("passport", "user_100").WherePri(1).Update()
  2648  		t.AssertNil(err)
  2649  		n, err := r.RowsAffected()
  2650  		t.AssertNil(err)
  2651  		t.Assert(n, 1)
  2652  
  2653  		one, err = db.Model(table).Cache(time.Second, "test1").FindOne(1)
  2654  		t.AssertNil(err)
  2655  		t.Assert(one["passport"], "user_1")
  2656  
  2657  		time.Sleep(time.Second * 2)
  2658  
  2659  		one, err = db.Model(table).Cache(time.Second, "test1").FindOne(1)
  2660  		t.AssertNil(err)
  2661  		t.Assert(one["passport"], "user_100")
  2662  	})
  2663  	gtest.C(t, func(t *gtest.T) {
  2664  		one, err := db.Model(table).Cache(time.Second, "test2").FindOne(2)
  2665  		t.AssertNil(err)
  2666  		t.Assert(one["passport"], "user_2")
  2667  
  2668  		r, err := db.Model(table).Data("passport", "user_200").Cache(-1, "test2").WherePri(2).Update()
  2669  		t.AssertNil(err)
  2670  		n, err := r.RowsAffected()
  2671  		t.AssertNil(err)
  2672  		t.Assert(n, 1)
  2673  
  2674  		one, err = db.Model(table).Cache(time.Second, "test2").FindOne(2)
  2675  		t.AssertNil(err)
  2676  		t.Assert(one["passport"], "user_200")
  2677  	})
  2678  	// transaction.
  2679  	gtest.C(t, func(t *gtest.T) {
  2680  		// make cache for id 3
  2681  		one, err := db.Model(table).Cache(time.Second, "test3").FindOne(3)
  2682  		t.AssertNil(err)
  2683  		t.Assert(one["passport"], "user_3")
  2684  
  2685  		r, err := db.Model(table).Data("passport", "user_300").Cache(time.Second, "test3").WherePri(3).Update()
  2686  		t.AssertNil(err)
  2687  		n, err := r.RowsAffected()
  2688  		t.AssertNil(err)
  2689  		t.Assert(n, 1)
  2690  
  2691  		err = db.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
  2692  			one, err := tx.Model(table).Cache(time.Second, "test3").FindOne(3)
  2693  			t.AssertNil(err)
  2694  			t.Assert(one["passport"], "user_300")
  2695  			return nil
  2696  		})
  2697  		t.AssertNil(err)
  2698  
  2699  		one, err = db.Model(table).Cache(time.Second, "test3").FindOne(3)
  2700  		t.AssertNil(err)
  2701  		t.Assert(one["passport"], "user_3")
  2702  	})
  2703  	gtest.C(t, func(t *gtest.T) {
  2704  		// make cache for id 4
  2705  		one, err := db.Model(table).Cache(time.Second, "test4").FindOne(4)
  2706  		t.AssertNil(err)
  2707  		t.Assert(one["passport"], "user_4")
  2708  
  2709  		r, err := db.Model(table).Data("passport", "user_400").Cache(time.Second, "test3").WherePri(4).Update()
  2710  		t.AssertNil(err)
  2711  		n, err := r.RowsAffected()
  2712  		t.AssertNil(err)
  2713  		t.Assert(n, 1)
  2714  
  2715  		err = db.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
  2716  			// Cache feature disabled.
  2717  			one, err := tx.Model(table).Cache(time.Second, "test4").FindOne(4)
  2718  			t.AssertNil(err)
  2719  			t.Assert(one["passport"], "user_400")
  2720  			// Update the cache.
  2721  			r, err := tx.Model(table).Data("passport", "user_4000").
  2722  				Cache(-1, "test4").WherePri(4).Update()
  2723  			t.AssertNil(err)
  2724  			n, err := r.RowsAffected()
  2725  			t.AssertNil(err)
  2726  			t.Assert(n, 1)
  2727  			return nil
  2728  		})
  2729  		t.AssertNil(err)
  2730  		// Read from db.
  2731  		one, err = db.Model(table).Cache(time.Second, "test4").FindOne(4)
  2732  		t.AssertNil(err)
  2733  		t.Assert(one["passport"], "user_4000")
  2734  	})
  2735  }
  2736  
  2737  func Test_Model_Having(t *testing.T) {
  2738  	table := createInitTable()
  2739  	defer dropTable(table)
  2740  
  2741  	gtest.C(t, func(t *gtest.T) {
  2742  		all, err := db.Model(table).Where("id > 1").Having("id > 8").All()
  2743  		t.AssertNil(err)
  2744  		t.Assert(len(all), 2)
  2745  	})
  2746  	gtest.C(t, func(t *gtest.T) {
  2747  		all, err := db.Model(table).Where("id > 1").Having("id > ?", 8).All()
  2748  		t.AssertNil(err)
  2749  		t.Assert(len(all), 2)
  2750  	})
  2751  	gtest.C(t, func(t *gtest.T) {
  2752  		all, err := db.Model(table).Where("id > ?", 1).Having("id > ?", 8).All()
  2753  		t.AssertNil(err)
  2754  		t.Assert(len(all), 2)
  2755  	})
  2756  	gtest.C(t, func(t *gtest.T) {
  2757  		all, err := db.Model(table).Where("id > ?", 1).Having("id", 8).All()
  2758  		t.AssertNil(err)
  2759  		t.Assert(len(all), 1)
  2760  	})
  2761  }
  2762  
  2763  func Test_Model_Distinct(t *testing.T) {
  2764  	table := createInitTable()
  2765  	defer dropTable(table)
  2766  
  2767  	gtest.C(t, func(t *gtest.T) {
  2768  		all, err := db.Model(table, "t").Fields("distinct t.id").Where("id > 1").Having("id > 8").All()
  2769  		t.AssertNil(err)
  2770  		t.Assert(len(all), 2)
  2771  	})
  2772  	gtest.C(t, func(t *gtest.T) {
  2773  		count, err := db.Model(table).Where("id > 1").Distinct().Count()
  2774  		t.AssertNil(err)
  2775  		t.Assert(count, 9)
  2776  	})
  2777  }
  2778  
  2779  func Test_Model_Min_Max(t *testing.T) {
  2780  	table := createInitTable()
  2781  	defer dropTable(table)
  2782  
  2783  	gtest.C(t, func(t *gtest.T) {
  2784  		value, err := db.Model(table, "t").Fields("min(t.id)").Where("id > 1").Value()
  2785  		t.AssertNil(err)
  2786  		t.Assert(value.Int(), 2)
  2787  	})
  2788  	gtest.C(t, func(t *gtest.T) {
  2789  		value, err := db.Model(table, "t").Fields("max(t.id)").Where("id > 1").Value()
  2790  		t.AssertNil(err)
  2791  		t.Assert(value.Int(), 10)
  2792  	})
  2793  }
  2794  
  2795  func Test_Model_Fields_AutoMapping(t *testing.T) {
  2796  	table := createInitTable()
  2797  	defer dropTable(table)
  2798  
  2799  	gtest.C(t, func(t *gtest.T) {
  2800  		value, err := db.Model(table).Fields("ID").Where("id", 2).Value()
  2801  		t.AssertNil(err)
  2802  		t.Assert(value.Int(), 2)
  2803  	})
  2804  
  2805  	gtest.C(t, func(t *gtest.T) {
  2806  		value, err := db.Model(table).Fields("NICK_NAME").Where("id", 2).Value()
  2807  		t.AssertNil(err)
  2808  		t.Assert(value.String(), "name_2")
  2809  	})
  2810  	// Map
  2811  	gtest.C(t, func(t *gtest.T) {
  2812  		one, err := db.Model(table).Fields(g.Map{
  2813  			"ID":        1,
  2814  			"NICK_NAME": 1,
  2815  		}).Where("id", 2).One()
  2816  		t.AssertNil(err)
  2817  		t.Assert(len(one), 2)
  2818  		t.Assert(one["id"], 2)
  2819  		t.Assert(one["nickname"], "name_2")
  2820  	})
  2821  	// Struct
  2822  	gtest.C(t, func(t *gtest.T) {
  2823  		type T struct {
  2824  			ID       int
  2825  			NICKNAME int
  2826  		}
  2827  		one, err := db.Model(table).Fields(&T{
  2828  			ID:       0,
  2829  			NICKNAME: 0,
  2830  		}).Where("id", 2).One()
  2831  		t.AssertNil(err)
  2832  		t.Assert(len(one), 2)
  2833  		t.Assert(one["id"], 2)
  2834  		t.Assert(one["nickname"], "name_2")
  2835  	})
  2836  }
  2837  
  2838  func Test_Model_FieldsEx_AutoMapping(t *testing.T) {
  2839  	table := createInitTable()
  2840  	defer dropTable(table)
  2841  
  2842  	// "id":          i,
  2843  	// "passport":    fmt.Sprintf(`user_%d`, i),
  2844  	// "password":    fmt.Sprintf(`pass_%d`, i),
  2845  	// "nickname":    fmt.Sprintf(`name_%d`, i),
  2846  	// "create_time": gtime.NewFromStr("2018-10-24 10:00:00").String(),
  2847  
  2848  	gtest.C(t, func(t *gtest.T) {
  2849  		value, err := db.Model(table).FieldsEx("Passport, Password, NickName, CreateTime").Where("id", 2).Value()
  2850  		t.AssertNil(err)
  2851  		t.Assert(value.Int(), 2)
  2852  	})
  2853  
  2854  	gtest.C(t, func(t *gtest.T) {
  2855  		value, err := db.Model(table).FieldsEx("ID, Passport, Password, CreateTime").Where("id", 2).Value()
  2856  		t.AssertNil(err)
  2857  		t.Assert(value.String(), "name_2")
  2858  	})
  2859  	// Map
  2860  	gtest.C(t, func(t *gtest.T) {
  2861  		one, err := db.Model(table).FieldsEx(g.Map{
  2862  			"Passport":   1,
  2863  			"Password":   1,
  2864  			"CreateTime": 1,
  2865  		}).Where("id", 2).One()
  2866  		t.AssertNil(err)
  2867  		t.Assert(len(one), 2)
  2868  		t.Assert(one["id"], 2)
  2869  		t.Assert(one["nickname"], "name_2")
  2870  	})
  2871  	// Struct
  2872  	gtest.C(t, func(t *gtest.T) {
  2873  		type T struct {
  2874  			Passport   int
  2875  			Password   int
  2876  			CreateTime int
  2877  		}
  2878  		one, err := db.Model(table).FieldsEx(&T{
  2879  			Passport:   0,
  2880  			Password:   0,
  2881  			CreateTime: 0,
  2882  		}).Where("id", 2).One()
  2883  		t.AssertNil(err)
  2884  		t.Assert(len(one), 2)
  2885  		t.Assert(one["id"], 2)
  2886  		t.Assert(one["nickname"], "name_2")
  2887  	})
  2888  }
  2889  
  2890  func Test_Model_Fields_Struct(t *testing.T) {
  2891  	table := createInitTable()
  2892  	defer dropTable(table)
  2893  
  2894  	type A struct {
  2895  		Passport string
  2896  		Password string
  2897  	}
  2898  	type B struct {
  2899  		A
  2900  		NickName string
  2901  	}
  2902  	gtest.C(t, func(t *gtest.T) {
  2903  		one, err := db.Model(table).Fields(A{}).Where("id", 2).One()
  2904  		t.AssertNil(err)
  2905  		t.Assert(len(one), 2)
  2906  		t.Assert(one["passport"], "user_2")
  2907  		t.Assert(one["password"], "pass_2")
  2908  	})
  2909  	gtest.C(t, func(t *gtest.T) {
  2910  		one, err := db.Model(table).Fields(&A{}).Where("id", 2).One()
  2911  		t.AssertNil(err)
  2912  		t.Assert(len(one), 2)
  2913  		t.Assert(one["passport"], "user_2")
  2914  		t.Assert(one["password"], "pass_2")
  2915  	})
  2916  	gtest.C(t, func(t *gtest.T) {
  2917  		one, err := db.Model(table).Fields(B{}).Where("id", 2).One()
  2918  		t.AssertNil(err)
  2919  		t.Assert(len(one), 3)
  2920  		t.Assert(one["passport"], "user_2")
  2921  		t.Assert(one["password"], "pass_2")
  2922  		t.Assert(one["nickname"], "name_2")
  2923  	})
  2924  	gtest.C(t, func(t *gtest.T) {
  2925  		one, err := db.Model(table).Fields(&B{}).Where("id", 2).One()
  2926  		t.AssertNil(err)
  2927  		t.Assert(len(one), 3)
  2928  		t.Assert(one["passport"], "user_2")
  2929  		t.Assert(one["password"], "pass_2")
  2930  		t.Assert(one["nickname"], "name_2")
  2931  	})
  2932  }
  2933  func Test_Model_NullField(t *testing.T) {
  2934  	table := createTable()
  2935  	defer dropTable(table)
  2936  
  2937  	gtest.C(t, func(t *gtest.T) {
  2938  		type User struct {
  2939  			Id       int
  2940  			Passport *string
  2941  		}
  2942  		data := g.Map{
  2943  			"id":       1,
  2944  			"passport": nil,
  2945  		}
  2946  		result, err := db.Model(table).Data(data).Insert()
  2947  		t.AssertNil(err)
  2948  		n, _ := result.RowsAffected()
  2949  		t.Assert(n, 1)
  2950  		one, err := db.Model(table).FindOne(1)
  2951  		t.AssertNil(err)
  2952  
  2953  		var user *User
  2954  		err = one.Struct(&user)
  2955  		t.AssertNil(err)
  2956  		t.Assert(user.Id, data["id"])
  2957  		t.Assert(user.Passport, data["passport"])
  2958  	})
  2959  }
  2960  
  2961  func Test_Model_Empty_Slice_Argument(t *testing.T) {
  2962  	table := createInitTable()
  2963  	defer dropTable(table)
  2964  	gtest.C(t, func(t *gtest.T) {
  2965  		result, err := db.Model(table).Where(`id`, g.Slice{}).All()
  2966  		t.AssertNil(err)
  2967  		t.Assert(len(result), 0)
  2968  	})
  2969  	gtest.C(t, func(t *gtest.T) {
  2970  		result, err := db.Model(table).Where(`id in(?)`, g.Slice{}).All()
  2971  		t.AssertNil(err)
  2972  		t.Assert(len(result), 0)
  2973  	})
  2974  }
  2975  
  2976  func Test_Model_HasTable(t *testing.T) {
  2977  	table := createTable()
  2978  	defer dropTable(table)
  2979  
  2980  	gtest.C(t, func(t *gtest.T) {
  2981  		result, err := db.GetCore().HasTable(table)
  2982  		t.Assert(result, true)
  2983  		t.AssertNil(err)
  2984  	})
  2985  
  2986  	gtest.C(t, func(t *gtest.T) {
  2987  		result, err := db.GetCore().HasTable("table12321")
  2988  		t.Assert(result, false)
  2989  		t.AssertNil(err)
  2990  	})
  2991  }
  2992  
  2993  func Test_Model_HasField(t *testing.T) {
  2994  	table := createTable()
  2995  	defer dropTable(table)
  2996  
  2997  	gtest.C(t, func(t *gtest.T) {
  2998  		result, err := db.Model(table).HasField("id")
  2999  		t.Assert(result, true)
  3000  		t.AssertNil(err)
  3001  	})
  3002  
  3003  	gtest.C(t, func(t *gtest.T) {
  3004  		result, err := db.Model(table).HasField("id123")
  3005  		t.Assert(result, false)
  3006  		t.AssertNil(err)
  3007  	})
  3008  }
  3009  
  3010  // Issue: https://github.com/gogf/gf/issues/1002
  3011  func Test_Model_Issue1002(t *testing.T) {
  3012  	table := createTable()
  3013  	defer dropTable(table)
  3014  
  3015  	result, err := db.Model(table).Data(g.Map{
  3016  		"id":          1,
  3017  		"passport":    "port_1",
  3018  		"password":    "pass_1",
  3019  		"nickname":    "name_2",
  3020  		"create_time": "2020-10-27 19:03:33",
  3021  	}).Insert()
  3022  	gtest.AssertNil(err)
  3023  	n, _ := result.RowsAffected()
  3024  	gtest.Assert(n, 1)
  3025  
  3026  	// where + string.
  3027  	gtest.C(t, func(t *gtest.T) {
  3028  		v, err := db.Model(table).Fields("id").Where("create_time>'2020-10-27 19:03:32' and create_time<'2020-10-27 19:03:34'").Value()
  3029  		t.AssertNil(err)
  3030  		t.Assert(v.Int(), 1)
  3031  	})
  3032  	gtest.C(t, func(t *gtest.T) {
  3033  		v, err := db.Model(table).Fields("id").Where("create_time>'2020-10-27 19:03:32' and create_time<'2020-10-27 19:03:34'").FindValue()
  3034  		t.AssertNil(err)
  3035  		t.Assert(v.Int(), 1)
  3036  	})
  3037  	gtest.C(t, func(t *gtest.T) {
  3038  		v, err := db.Model(table).Where("create_time>'2020-10-27 19:03:32' and create_time<'2020-10-27 19:03:34'").FindValue("id")
  3039  		t.AssertNil(err)
  3040  		t.Assert(v.Int(), 1)
  3041  	})
  3042  	// where + string arguments.
  3043  	gtest.C(t, func(t *gtest.T) {
  3044  		v, err := db.Model(table).Fields("id").Where("create_time>? and create_time<?", "2020-10-27 19:03:32", "2020-10-27 19:03:34").Value()
  3045  		t.AssertNil(err)
  3046  		t.Assert(v.Int(), 1)
  3047  	})
  3048  	gtest.C(t, func(t *gtest.T) {
  3049  		v, err := db.Model(table).Fields("id").Where("create_time>? and create_time<?", "2020-10-27 19:03:32", "2020-10-27 19:03:34").FindValue()
  3050  		t.AssertNil(err)
  3051  		t.Assert(v.Int(), 1)
  3052  	})
  3053  	gtest.C(t, func(t *gtest.T) {
  3054  		v, err := db.Model(table).Where("create_time>? and create_time<?", "2020-10-27 19:03:32", "2020-10-27 19:03:34").FindValue("id")
  3055  		t.AssertNil(err)
  3056  		t.Assert(v.Int(), 1)
  3057  	})
  3058  	// where + gtime.Time arguments.
  3059  	gtest.C(t, func(t *gtest.T) {
  3060  		v, err := db.Model(table).Fields("id").Where("create_time>? and create_time<?", gtime.New("2020-10-27 19:03:32"), gtime.New("2020-10-27 19:03:34")).Value()
  3061  		t.AssertNil(err)
  3062  		t.Assert(v.Int(), 1)
  3063  	})
  3064  	gtest.C(t, func(t *gtest.T) {
  3065  		v, err := db.Model(table).Fields("id").Where("create_time>? and create_time<?", gtime.New("2020-10-27 19:03:32"), gtime.New("2020-10-27 19:03:34")).FindValue()
  3066  		t.AssertNil(err)
  3067  		t.Assert(v.Int(), 1)
  3068  	})
  3069  	gtest.C(t, func(t *gtest.T) {
  3070  		v, err := db.Model(table).Where("create_time>? and create_time<?", gtime.New("2020-10-27 19:03:32"), gtime.New("2020-10-27 19:03:34")).FindValue("id")
  3071  		t.AssertNil(err)
  3072  		t.Assert(v.Int(), 1)
  3073  	})
  3074  	// where + time.Time arguments, UTC.
  3075  	gtest.C(t, func(t *gtest.T) {
  3076  		t1, _ := time.Parse("2006-01-02 15:04:05", "2020-10-27 19:03:32")
  3077  		t2, _ := time.Parse("2006-01-02 15:04:05", "2020-10-27 19:03:34")
  3078  		{
  3079  			v, err := db.Model(table).Fields("id").Where("create_time>? and create_time<?", t1, t2).Value()
  3080  			t.AssertNil(err)
  3081  			t.Assert(v.Int(), 1)
  3082  		}
  3083  		{
  3084  			v, err := db.Model(table).Fields("id").Where("create_time>? and create_time<?", t1, t2).FindValue()
  3085  			t.AssertNil(err)
  3086  			t.Assert(v.Int(), 1)
  3087  		}
  3088  		{
  3089  			v, err := db.Model(table).Where("create_time>? and create_time<?", t1, t2).FindValue("id")
  3090  			t.AssertNil(err)
  3091  			t.Assert(v.Int(), 1)
  3092  		}
  3093  	})
  3094  	// where + time.Time arguments, +8.
  3095  	//gtest.C(t, func(t *gtest.T) {
  3096  	//	// Change current timezone to +8 zone.
  3097  	//	location, err := time.LoadLocation("Asia/Shanghai")
  3098  	//	t.AssertNil(err)
  3099  	//	t1, _ := time.ParseInLocation("2006-01-02 15:04:05", "2020-10-27 19:03:32", location)
  3100  	//	t2, _ := time.ParseInLocation("2006-01-02 15:04:05", "2020-10-27 19:03:34", location)
  3101  	//	{
  3102  	//		v, err := db.Model(table).Fields("id").Where("create_time>? and create_time<?", t1, t2).Value()
  3103  	//		t.AssertNil(err)
  3104  	//		t.Assert(v.Int(), 1)
  3105  	//	}
  3106  	//	{
  3107  	//		v, err := db.Model(table).Fields("id").Where("create_time>? and create_time<?", t1, t2).FindValue()
  3108  	//		t.AssertNil(err)
  3109  	//		t.Assert(v.Int(), 1)
  3110  	//	}
  3111  	//	{
  3112  	//		v, err := db.Model(table).Where("create_time>? and create_time<?", t1, t2).FindValue("id")
  3113  	//		t.AssertNil(err)
  3114  	//		t.Assert(v.Int(), 1)
  3115  	//	}
  3116  	//})
  3117  }
  3118  
  3119  func createTableForTimeZoneTest() string {
  3120  	tableName := "user_" + gtime.Now().TimestampNanoStr()
  3121  	if _, err := db.Exec(fmt.Sprintf(`
  3122  	    CREATE TABLE %s (
  3123  	        id          int(10) unsigned NOT NULL AUTO_INCREMENT,
  3124  	        passport    varchar(45) NULL,
  3125  	        password    char(32) NULL,
  3126  	        nickname    varchar(45) NULL,
  3127  	        created_at timestamp NULL,
  3128   			updated_at timestamp NULL,
  3129  			deleted_at timestamp NULL,
  3130  	        PRIMARY KEY (id)
  3131  	    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  3132  	    `, tableName,
  3133  	)); err != nil {
  3134  		gtest.Fatal(err)
  3135  	}
  3136  	return tableName
  3137  }
  3138  
  3139  // https://github.com/gogf/gf/issues/1012
  3140  func Test_TimeZoneInsert(t *testing.T) {
  3141  	tableName := createTableForTimeZoneTest()
  3142  	defer dropTable(tableName)
  3143  
  3144  	asiaLocal, err := time.LoadLocation("Asia/Shanghai")
  3145  	gtest.AssertNil(err)
  3146  
  3147  	CreateTime := "2020-11-22 12:23:45"
  3148  	UpdateTime := "2020-11-22 13:23:45"
  3149  	DeleteTime := "2020-11-22 14:23:45"
  3150  	type User struct {
  3151  		Id        int         `json:"id"`
  3152  		CreatedAt *gtime.Time `json:"created_at"`
  3153  		UpdatedAt gtime.Time  `json:"updated_at"`
  3154  		DeletedAt time.Time   `json:"deleted_at"`
  3155  	}
  3156  	t1, _ := time.ParseInLocation("2006-01-02 15:04:05", CreateTime, asiaLocal)
  3157  	t2, _ := time.ParseInLocation("2006-01-02 15:04:05", UpdateTime, asiaLocal)
  3158  	t3, _ := time.ParseInLocation("2006-01-02 15:04:05", DeleteTime, asiaLocal)
  3159  	u := &User{
  3160  		Id:        1,
  3161  		CreatedAt: gtime.New(t1.UTC()),
  3162  		UpdatedAt: *gtime.New(t2.UTC()),
  3163  		DeletedAt: t3.UTC(),
  3164  	}
  3165  
  3166  	gtest.C(t, func(t *gtest.T) {
  3167  		_, _ = db.Model(tableName).Unscoped().Insert(u)
  3168  		userEntity := &User{}
  3169  		err := db.Model(tableName).Where("id", 1).Unscoped().Scan(&userEntity)
  3170  		t.AssertNil(err)
  3171  		t.Assert(userEntity.CreatedAt.String(), "2020-11-22 04:23:45")
  3172  		t.Assert(userEntity.UpdatedAt.String(), "2020-11-22 05:23:45")
  3173  		t.Assert(gtime.NewFromTime(userEntity.DeletedAt).String(), "2020-11-22 06:23:45")
  3174  	})
  3175  }
  3176  
  3177  func Test_Model_Fields_Map_Struct(t *testing.T) {
  3178  	table := createInitTable()
  3179  	defer dropTable(table)
  3180  	// map
  3181  	gtest.C(t, func(t *gtest.T) {
  3182  		result, err := db.Model(table).Fields(g.Map{
  3183  			"ID":         1,
  3184  			"PASSPORT":   1,
  3185  			"NONE_EXIST": 1,
  3186  		}).Where("id", 1).One()
  3187  		t.AssertNil(err)
  3188  		t.Assert(len(result), 2)
  3189  		t.Assert(result["id"], 1)
  3190  		t.Assert(result["passport"], "user_1")
  3191  	})
  3192  	// struct
  3193  	gtest.C(t, func(t *gtest.T) {
  3194  		type A struct {
  3195  			ID       int
  3196  			PASSPORT string
  3197  			XXX_TYPE int
  3198  		}
  3199  		var a = A{}
  3200  		err := db.Model(table).Fields(a).Where("id", 1).Scan(&a)
  3201  		t.AssertNil(err)
  3202  		t.Assert(a.ID, 1)
  3203  		t.Assert(a.PASSPORT, "user_1")
  3204  		t.Assert(a.XXX_TYPE, 0)
  3205  	})
  3206  	// *struct
  3207  	gtest.C(t, func(t *gtest.T) {
  3208  		type A struct {
  3209  			ID       int
  3210  			PASSPORT string
  3211  			XXX_TYPE int
  3212  		}
  3213  		var a *A
  3214  		err := db.Model(table).Fields(a).Where("id", 1).Scan(&a)
  3215  		t.AssertNil(err)
  3216  		t.Assert(a.ID, 1)
  3217  		t.Assert(a.PASSPORT, "user_1")
  3218  		t.Assert(a.XXX_TYPE, 0)
  3219  	})
  3220  	// **struct
  3221  	gtest.C(t, func(t *gtest.T) {
  3222  		type A struct {
  3223  			ID       int
  3224  			PASSPORT string
  3225  			XXX_TYPE int
  3226  		}
  3227  		var a *A
  3228  		err := db.Model(table).Fields(&a).Where("id", 1).Scan(&a)
  3229  		t.AssertNil(err)
  3230  		t.Assert(a.ID, 1)
  3231  		t.Assert(a.PASSPORT, "user_1")
  3232  		t.Assert(a.XXX_TYPE, 0)
  3233  	})
  3234  }
  3235  
  3236  func Test_Model_WhereIn(t *testing.T) {
  3237  	table := createInitTable()
  3238  	defer dropTable(table)
  3239  
  3240  	gtest.C(t, func(t *gtest.T) {
  3241  		result, err := db.Model(table).WhereIn("id", g.Slice{1, 2, 3, 4}).WhereIn("id", g.Slice{3, 4, 5}).OrderAsc("id").All()
  3242  		t.AssertNil(err)
  3243  		t.Assert(len(result), 2)
  3244  		t.Assert(result[0]["id"], 3)
  3245  		t.Assert(result[1]["id"], 4)
  3246  	})
  3247  }
  3248  
  3249  func Test_Model_WhereNotIn(t *testing.T) {
  3250  	table := createInitTable()
  3251  	defer dropTable(table)
  3252  
  3253  	gtest.C(t, func(t *gtest.T) {
  3254  		result, err := db.Model(table).WhereNotIn("id", g.Slice{1, 2, 3, 4}).WhereNotIn("id", g.Slice{3, 4, 5}).OrderAsc("id").All()
  3255  		t.AssertNil(err)
  3256  		t.Assert(len(result), 5)
  3257  		t.Assert(result[0]["id"], 6)
  3258  		t.Assert(result[1]["id"], 7)
  3259  	})
  3260  }
  3261  
  3262  func Test_Model_WhereOrIn(t *testing.T) {
  3263  	table := createInitTable()
  3264  	defer dropTable(table)
  3265  
  3266  	gtest.C(t, func(t *gtest.T) {
  3267  		result, err := db.Model(table).WhereOrIn("id", g.Slice{1, 2, 3, 4}).WhereOrIn("id", g.Slice{3, 4, 5}).OrderAsc("id").All()
  3268  		t.AssertNil(err)
  3269  		t.Assert(len(result), 5)
  3270  		t.Assert(result[0]["id"], 1)
  3271  		t.Assert(result[4]["id"], 5)
  3272  	})
  3273  }
  3274  
  3275  func Test_Model_WhereOrNotIn(t *testing.T) {
  3276  	table := createInitTable()
  3277  	defer dropTable(table)
  3278  
  3279  	gtest.C(t, func(t *gtest.T) {
  3280  		result, err := db.Model(table).WhereOrNotIn("id", g.Slice{1, 2, 3, 4}).WhereOrNotIn("id", g.Slice{3, 4, 5}).OrderAsc("id").All()
  3281  		t.AssertNil(err)
  3282  		t.Assert(len(result), 8)
  3283  		t.Assert(result[0]["id"], 1)
  3284  		t.Assert(result[4]["id"], 7)
  3285  	})
  3286  }
  3287  
  3288  func Test_Model_WhereBetween(t *testing.T) {
  3289  	table := createInitTable()
  3290  	defer dropTable(table)
  3291  
  3292  	gtest.C(t, func(t *gtest.T) {
  3293  		result, err := db.Model(table).WhereBetween("id", 1, 4).WhereBetween("id", 3, 5).OrderAsc("id").All()
  3294  		t.AssertNil(err)
  3295  		t.Assert(len(result), 2)
  3296  		t.Assert(result[0]["id"], 3)
  3297  		t.Assert(result[1]["id"], 4)
  3298  	})
  3299  }
  3300  
  3301  func Test_Model_WhereNotBetween(t *testing.T) {
  3302  	table := createInitTable()
  3303  	defer dropTable(table)
  3304  
  3305  	gtest.C(t, func(t *gtest.T) {
  3306  		result, err := db.Model(table).WhereNotBetween("id", 2, 8).WhereNotBetween("id", 3, 100).OrderAsc("id").All()
  3307  		t.AssertNil(err)
  3308  		t.Assert(len(result), 1)
  3309  		t.Assert(result[0]["id"], 1)
  3310  	})
  3311  }
  3312  
  3313  func Test_Model_WhereOrBetween(t *testing.T) {
  3314  	table := createInitTable()
  3315  	defer dropTable(table)
  3316  
  3317  	gtest.C(t, func(t *gtest.T) {
  3318  		result, err := db.Model(table).WhereOrBetween("id", 1, 4).WhereOrBetween("id", 3, 5).OrderDesc("id").All()
  3319  		t.AssertNil(err)
  3320  		t.Assert(len(result), 5)
  3321  		t.Assert(result[0]["id"], 5)
  3322  		t.Assert(result[4]["id"], 1)
  3323  	})
  3324  }
  3325  
  3326  func Test_Model_WhereOrNotBetween(t *testing.T) {
  3327  	table := createInitTable()
  3328  	defer dropTable(table)
  3329  	//db.SetDebug(true)
  3330  	gtest.C(t, func(t *gtest.T) {
  3331  		result, err := db.Model(table).WhereOrNotBetween("id", 1, 4).WhereOrNotBetween("id", 3, 5).OrderDesc("id").All()
  3332  		t.AssertNil(err)
  3333  		t.Assert(len(result), 8)
  3334  		t.Assert(result[0]["id"], 10)
  3335  		t.Assert(result[4]["id"], 6)
  3336  	})
  3337  }
  3338  
  3339  func Test_Model_WhereLike(t *testing.T) {
  3340  	table := createInitTable()
  3341  	defer dropTable(table)
  3342  
  3343  	gtest.C(t, func(t *gtest.T) {
  3344  		result, err := db.Model(table).WhereLike("nickname", "name%").OrderAsc("id").All()
  3345  		t.AssertNil(err)
  3346  		t.Assert(len(result), TableSize)
  3347  		t.Assert(result[0]["id"], 1)
  3348  		t.Assert(result[TableSize-1]["id"], TableSize)
  3349  	})
  3350  }
  3351  
  3352  func Test_Model_WhereNotLike(t *testing.T) {
  3353  	table := createInitTable()
  3354  	defer dropTable(table)
  3355  
  3356  	gtest.C(t, func(t *gtest.T) {
  3357  		result, err := db.Model(table).WhereNotLike("nickname", "name%").OrderAsc("id").All()
  3358  		t.AssertNil(err)
  3359  		t.Assert(len(result), 0)
  3360  	})
  3361  }
  3362  
  3363  func Test_Model_WhereOrLike(t *testing.T) {
  3364  	table := createInitTable()
  3365  	defer dropTable(table)
  3366  
  3367  	gtest.C(t, func(t *gtest.T) {
  3368  		result, err := db.Model(table).WhereOrLike("nickname", "namexxx%").WhereOrLike("nickname", "name%").OrderAsc("id").All()
  3369  		t.AssertNil(err)
  3370  		t.Assert(len(result), TableSize)
  3371  		t.Assert(result[0]["id"], 1)
  3372  		t.Assert(result[TableSize-1]["id"], TableSize)
  3373  	})
  3374  }
  3375  
  3376  func Test_Model_WhereOrNotLike(t *testing.T) {
  3377  	table := createInitTable()
  3378  	defer dropTable(table)
  3379  
  3380  	gtest.C(t, func(t *gtest.T) {
  3381  		result, err := db.Model(table).WhereOrNotLike("nickname", "namexxx%").WhereOrNotLike("nickname", "name%").OrderAsc("id").All()
  3382  		t.AssertNil(err)
  3383  		t.Assert(len(result), TableSize)
  3384  		t.Assert(result[0]["id"], 1)
  3385  		t.Assert(result[TableSize-1]["id"], TableSize)
  3386  	})
  3387  }
  3388  
  3389  func Test_Model_WhereNull(t *testing.T) {
  3390  	table := createInitTable()
  3391  	defer dropTable(table)
  3392  
  3393  	gtest.C(t, func(t *gtest.T) {
  3394  		result, err := db.Model(table).WhereNull("nickname").WhereNull("passport").OrderAsc("id").All()
  3395  		t.AssertNil(err)
  3396  		t.Assert(len(result), 0)
  3397  	})
  3398  }
  3399  
  3400  func Test_Model_WhereNotNull(t *testing.T) {
  3401  	table := createInitTable()
  3402  	defer dropTable(table)
  3403  
  3404  	gtest.C(t, func(t *gtest.T) {
  3405  		result, err := db.Model(table).WhereNotNull("nickname").WhereNotNull("passport").OrderAsc("id").All()
  3406  		t.AssertNil(err)
  3407  		t.Assert(len(result), TableSize)
  3408  		t.Assert(result[0]["id"], 1)
  3409  		t.Assert(result[TableSize-1]["id"], TableSize)
  3410  	})
  3411  }
  3412  
  3413  func Test_Model_WhereOrNull(t *testing.T) {
  3414  	table := createInitTable()
  3415  	defer dropTable(table)
  3416  
  3417  	gtest.C(t, func(t *gtest.T) {
  3418  		result, err := db.Model(table).WhereOrNull("nickname").WhereOrNull("passport").OrderAsc("id").OrderRandom().All()
  3419  		t.AssertNil(err)
  3420  		t.Assert(len(result), 0)
  3421  	})
  3422  }
  3423  
  3424  func Test_Model_WhereOrNotNull(t *testing.T) {
  3425  	table := createInitTable()
  3426  	defer dropTable(table)
  3427  
  3428  	gtest.C(t, func(t *gtest.T) {
  3429  		result, err := db.Model(table).WhereOrNotNull("nickname").WhereOrNotNull("passport").OrderAsc("id").All()
  3430  		t.AssertNil(err)
  3431  		t.Assert(len(result), TableSize)
  3432  		t.Assert(result[0]["id"], 1)
  3433  		t.Assert(result[TableSize-1]["id"], TableSize)
  3434  	})
  3435  }
  3436  
  3437  func Test_Model_WhereLT(t *testing.T) {
  3438  	table := createInitTable()
  3439  	defer dropTable(table)
  3440  
  3441  	gtest.C(t, func(t *gtest.T) {
  3442  		result, err := db.Model(table).WhereLT("id", 3).OrderAsc("id").All()
  3443  		t.AssertNil(err)
  3444  		t.Assert(len(result), 2)
  3445  		t.Assert(result[0]["id"], 1)
  3446  	})
  3447  }
  3448  
  3449  func Test_Model_WhereLTE(t *testing.T) {
  3450  	table := createInitTable()
  3451  	defer dropTable(table)
  3452  
  3453  	gtest.C(t, func(t *gtest.T) {
  3454  		result, err := db.Model(table).WhereLTE("id", 3).OrderAsc("id").All()
  3455  		t.AssertNil(err)
  3456  		t.Assert(len(result), 3)
  3457  		t.Assert(result[0]["id"], 1)
  3458  	})
  3459  }
  3460  
  3461  func Test_Model_WhereGT(t *testing.T) {
  3462  	table := createInitTable()
  3463  	defer dropTable(table)
  3464  
  3465  	gtest.C(t, func(t *gtest.T) {
  3466  		result, err := db.Model(table).WhereGT("id", 8).OrderAsc("id").All()
  3467  		t.AssertNil(err)
  3468  		t.Assert(len(result), 2)
  3469  		t.Assert(result[0]["id"], 9)
  3470  	})
  3471  }
  3472  
  3473  func Test_Model_WhereGTE(t *testing.T) {
  3474  	table := createInitTable()
  3475  	defer dropTable(table)
  3476  
  3477  	gtest.C(t, func(t *gtest.T) {
  3478  		result, err := db.Model(table).WhereGTE("id", 8).OrderAsc("id").All()
  3479  		t.AssertNil(err)
  3480  		t.Assert(len(result), 3)
  3481  		t.Assert(result[0]["id"], 8)
  3482  	})
  3483  }
  3484  
  3485  func Test_Model_WhereOrLT(t *testing.T) {
  3486  	table := createInitTable()
  3487  	defer dropTable(table)
  3488  
  3489  	gtest.C(t, func(t *gtest.T) {
  3490  		result, err := db.Model(table).WhereLT("id", 3).WhereOrLT("id", 4).OrderAsc("id").All()
  3491  		t.AssertNil(err)
  3492  		t.Assert(len(result), 3)
  3493  		t.Assert(result[0]["id"], 1)
  3494  		t.Assert(result[2]["id"], 3)
  3495  	})
  3496  }
  3497  
  3498  func Test_Model_WhereOrLTE(t *testing.T) {
  3499  	table := createInitTable()
  3500  	defer dropTable(table)
  3501  
  3502  	gtest.C(t, func(t *gtest.T) {
  3503  		result, err := db.Model(table).WhereLTE("id", 3).WhereOrLTE("id", 4).OrderAsc("id").All()
  3504  		t.AssertNil(err)
  3505  		t.Assert(len(result), 4)
  3506  		t.Assert(result[0]["id"], 1)
  3507  		t.Assert(result[3]["id"], 4)
  3508  	})
  3509  }
  3510  
  3511  func Test_Model_WhereOrGT(t *testing.T) {
  3512  	table := createInitTable()
  3513  	defer dropTable(table)
  3514  
  3515  	gtest.C(t, func(t *gtest.T) {
  3516  		result, err := db.Model(table).WhereGT("id", 8).WhereOrGT("id", 7).OrderAsc("id").All()
  3517  		t.AssertNil(err)
  3518  		t.Assert(len(result), 3)
  3519  		t.Assert(result[0]["id"], 8)
  3520  	})
  3521  }
  3522  
  3523  func Test_Model_WhereOrGTE(t *testing.T) {
  3524  	table := createInitTable()
  3525  	defer dropTable(table)
  3526  
  3527  	gtest.C(t, func(t *gtest.T) {
  3528  		result, err := db.Model(table).WhereGTE("id", 8).WhereOrGTE("id", 7).OrderAsc("id").All()
  3529  		t.AssertNil(err)
  3530  		t.Assert(len(result), 4)
  3531  		t.Assert(result[0]["id"], 7)
  3532  	})
  3533  }
  3534  
  3535  func Test_Model_Min_Max_Avg_Sum(t *testing.T) {
  3536  	table := createInitTable()
  3537  	defer dropTable(table)
  3538  
  3539  	gtest.C(t, func(t *gtest.T) {
  3540  		result, err := db.Model(table).Min("id")
  3541  		t.AssertNil(err)
  3542  		t.Assert(result, 1)
  3543  	})
  3544  	gtest.C(t, func(t *gtest.T) {
  3545  		result, err := db.Model(table).Max("id")
  3546  		t.AssertNil(err)
  3547  		t.Assert(result, TableSize)
  3548  	})
  3549  	gtest.C(t, func(t *gtest.T) {
  3550  		result, err := db.Model(table).Avg("id")
  3551  		t.AssertNil(err)
  3552  		t.Assert(result, 5.5)
  3553  	})
  3554  	gtest.C(t, func(t *gtest.T) {
  3555  		result, err := db.Model(table).Sum("id")
  3556  		t.AssertNil(err)
  3557  		t.Assert(result, 55)
  3558  	})
  3559  }
  3560  
  3561  func Test_Model_CountColumn(t *testing.T) {
  3562  	table := createInitTable()
  3563  	defer dropTable(table)
  3564  
  3565  	gtest.C(t, func(t *gtest.T) {
  3566  		result, err := db.Model(table).CountColumn("id")
  3567  		t.AssertNil(err)
  3568  		t.Assert(result, TableSize)
  3569  	})
  3570  	gtest.C(t, func(t *gtest.T) {
  3571  		result, err := db.Model(table).WhereIn("id", g.Slice{1, 2, 3}).CountColumn("id")
  3572  		t.AssertNil(err)
  3573  		t.Assert(result, 3)
  3574  	})
  3575  }
  3576  
  3577  func Test_Model_InsertAndGetId(t *testing.T) {
  3578  	table := createTable()
  3579  	defer dropTable(table)
  3580  	gtest.C(t, func(t *gtest.T) {
  3581  		id, err := db.Model(table).Data(g.Map{
  3582  			"id":       1,
  3583  			"passport": "user_1",
  3584  			"password": "pass_1",
  3585  			"nickname": "name_1",
  3586  		}).InsertAndGetId()
  3587  		t.AssertNil(err)
  3588  		t.Assert(id, 1)
  3589  	})
  3590  	gtest.C(t, func(t *gtest.T) {
  3591  		id, err := db.Model(table).Data(g.Map{
  3592  			"passport": "user_2",
  3593  			"password": "pass_2",
  3594  			"nickname": "name_2",
  3595  		}).InsertAndGetId()
  3596  		t.AssertNil(err)
  3597  		t.Assert(id, 2)
  3598  	})
  3599  }
  3600  
  3601  func Test_Model_Increment_Decrement(t *testing.T) {
  3602  	table := createInitTable()
  3603  	defer dropTable(table)
  3604  	gtest.C(t, func(t *gtest.T) {
  3605  		result, err := db.Model(table).Where("id", 1).Increment("id", 100)
  3606  		t.AssertNil(err)
  3607  		rows, _ := result.RowsAffected()
  3608  		t.Assert(rows, 1)
  3609  	})
  3610  	gtest.C(t, func(t *gtest.T) {
  3611  		result, err := db.Model(table).Where("id", 101).Decrement("id", 10)
  3612  		t.AssertNil(err)
  3613  		rows, _ := result.RowsAffected()
  3614  		t.Assert(rows, 1)
  3615  	})
  3616  	gtest.C(t, func(t *gtest.T) {
  3617  		count, err := db.Model(table).Where("id", 91).Count()
  3618  		t.AssertNil(err)
  3619  		t.Assert(count, 1)
  3620  	})
  3621  }
  3622  
  3623  func Test_Model_OnDuplicate(t *testing.T) {
  3624  	table := createInitTable()
  3625  	defer dropTable(table)
  3626  
  3627  	// string.
  3628  	gtest.C(t, func(t *gtest.T) {
  3629  		data := g.Map{
  3630  			"id":          1,
  3631  			"passport":    "pp1",
  3632  			"password":    "pw1",
  3633  			"nickname":    "n1",
  3634  			"create_time": "2016-06-06",
  3635  		}
  3636  		_, err := db.Model(table).OnDuplicate("passport,password").Data(data).Save()
  3637  		t.AssertNil(err)
  3638  		one, err := db.Model(table).FindOne(1)
  3639  		t.AssertNil(err)
  3640  		t.Assert(one["passport"], data["passport"])
  3641  		t.Assert(one["password"], data["password"])
  3642  		t.Assert(one["nickname"], "name_1")
  3643  	})
  3644  
  3645  	// slice.
  3646  	gtest.C(t, func(t *gtest.T) {
  3647  		data := g.Map{
  3648  			"id":          1,
  3649  			"passport":    "pp1",
  3650  			"password":    "pw1",
  3651  			"nickname":    "n1",
  3652  			"create_time": "2016-06-06",
  3653  		}
  3654  		_, err := db.Model(table).OnDuplicate(g.Slice{"passport", "password"}).Data(data).Save()
  3655  		t.AssertNil(err)
  3656  		one, err := db.Model(table).FindOne(1)
  3657  		t.AssertNil(err)
  3658  		t.Assert(one["passport"], data["passport"])
  3659  		t.Assert(one["password"], data["password"])
  3660  		t.Assert(one["nickname"], "name_1")
  3661  	})
  3662  
  3663  	// map.
  3664  	gtest.C(t, func(t *gtest.T) {
  3665  		data := g.Map{
  3666  			"id":          1,
  3667  			"passport":    "pp1",
  3668  			"password":    "pw1",
  3669  			"nickname":    "n1",
  3670  			"create_time": "2016-06-06",
  3671  		}
  3672  		_, err := db.Model(table).OnDuplicate(g.Map{
  3673  			"passport": "nickname",
  3674  			"password": "nickname",
  3675  		}).Data(data).Save()
  3676  		t.AssertNil(err)
  3677  		one, err := db.Model(table).FindOne(1)
  3678  		t.AssertNil(err)
  3679  		t.Assert(one["passport"], data["nickname"])
  3680  		t.Assert(one["password"], data["nickname"])
  3681  		t.Assert(one["nickname"], "name_1")
  3682  	})
  3683  
  3684  	// map+raw.
  3685  	gtest.C(t, func(t *gtest.T) {
  3686  		data := g.MapStrStr{
  3687  			"id":          "1",
  3688  			"passport":    "pp1",
  3689  			"password":    "pw1",
  3690  			"nickname":    "n1",
  3691  			"create_time": "2016-06-06",
  3692  		}
  3693  		_, err := db.Model(table).OnDuplicate(g.Map{
  3694  			"passport": gdb.Raw("CONCAT(VALUES(`passport`), '1')"),
  3695  			"password": gdb.Raw("CONCAT(VALUES(`password`), '2')"),
  3696  		}).Data(data).Save()
  3697  		t.AssertNil(err)
  3698  		one, err := db.Model(table).FindOne(1)
  3699  		t.AssertNil(err)
  3700  		t.Assert(one["passport"], data["passport"]+"1")
  3701  		t.Assert(one["password"], data["password"]+"2")
  3702  		t.Assert(one["nickname"], "name_1")
  3703  	})
  3704  }
  3705  
  3706  func Test_Model_OnDuplicateEx(t *testing.T) {
  3707  	table := createInitTable()
  3708  	defer dropTable(table)
  3709  
  3710  	// string.
  3711  	gtest.C(t, func(t *gtest.T) {
  3712  		data := g.Map{
  3713  			"id":          1,
  3714  			"passport":    "pp1",
  3715  			"password":    "pw1",
  3716  			"nickname":    "n1",
  3717  			"create_time": "2016-06-06",
  3718  		}
  3719  		_, err := db.Model(table).OnDuplicateEx("nickname,create_time").Data(data).Save()
  3720  		t.AssertNil(err)
  3721  		one, err := db.Model(table).FindOne(1)
  3722  		t.AssertNil(err)
  3723  		t.Assert(one["passport"], data["passport"])
  3724  		t.Assert(one["password"], data["password"])
  3725  		t.Assert(one["nickname"], "name_1")
  3726  	})
  3727  
  3728  	// slice.
  3729  	gtest.C(t, func(t *gtest.T) {
  3730  		data := g.Map{
  3731  			"id":          1,
  3732  			"passport":    "pp1",
  3733  			"password":    "pw1",
  3734  			"nickname":    "n1",
  3735  			"create_time": "2016-06-06",
  3736  		}
  3737  		_, err := db.Model(table).OnDuplicateEx(g.Slice{"nickname", "create_time"}).Data(data).Save()
  3738  		t.AssertNil(err)
  3739  		one, err := db.Model(table).FindOne(1)
  3740  		t.AssertNil(err)
  3741  		t.Assert(one["passport"], data["passport"])
  3742  		t.Assert(one["password"], data["password"])
  3743  		t.Assert(one["nickname"], "name_1")
  3744  	})
  3745  
  3746  	// map.
  3747  	gtest.C(t, func(t *gtest.T) {
  3748  		data := g.Map{
  3749  			"id":          1,
  3750  			"passport":    "pp1",
  3751  			"password":    "pw1",
  3752  			"nickname":    "n1",
  3753  			"create_time": "2016-06-06",
  3754  		}
  3755  		_, err := db.Model(table).OnDuplicateEx(g.Map{
  3756  			"nickname":    "nickname",
  3757  			"create_time": "nickname",
  3758  		}).Data(data).Save()
  3759  		t.AssertNil(err)
  3760  		one, err := db.Model(table).FindOne(1)
  3761  		t.AssertNil(err)
  3762  		t.Assert(one["passport"], data["passport"])
  3763  		t.Assert(one["password"], data["password"])
  3764  		t.Assert(one["nickname"], "name_1")
  3765  	})
  3766  }
  3767  
  3768  func Test_Model_Raw(t *testing.T) {
  3769  	table := createInitTable()
  3770  	defer dropTable(table)
  3771  
  3772  	gtest.C(t, func(t *gtest.T) {
  3773  		all, err := db.
  3774  			Raw(fmt.Sprintf("select * from %s where id in (?)", table), g.Slice{1, 5, 7, 8, 9, 10}).
  3775  			WhereLT("id", 8).
  3776  			WhereIn("id", g.Slice{1, 2, 3, 4, 5, 6, 7}).
  3777  			OrderDesc("id").
  3778  			Limit(2).
  3779  			All()
  3780  		t.AssertNil(err)
  3781  		t.Assert(len(all), 2)
  3782  		t.Assert(all[0]["id"], 7)
  3783  		t.Assert(all[1]["id"], 5)
  3784  	})
  3785  
  3786  	gtest.C(t, func(t *gtest.T) {
  3787  		count, err := db.
  3788  			Raw(fmt.Sprintf("select * from %s where id in (?)", table), g.Slice{1, 5, 7, 8, 9, 10}).
  3789  			WhereLT("id", 8).
  3790  			WhereIn("id", g.Slice{1, 2, 3, 4, 5, 6, 7}).
  3791  			OrderDesc("id").
  3792  			Limit(2).
  3793  			Count()
  3794  		t.AssertNil(err)
  3795  		t.Assert(count, 6)
  3796  	})
  3797  }
  3798  
  3799  func Test_Model_Handler(t *testing.T) {
  3800  	table := createInitTable()
  3801  	defer dropTable(table)
  3802  
  3803  	gtest.C(t, func(t *gtest.T) {
  3804  		m := db.Model(table).Safe().Handler(
  3805  			func(m *gdb.Model) *gdb.Model {
  3806  				return m.Page(0, 3)
  3807  			},
  3808  			func(m *gdb.Model) *gdb.Model {
  3809  				return m.Where("id", g.Slice{1, 2, 3, 4, 5, 6})
  3810  			},
  3811  			func(m *gdb.Model) *gdb.Model {
  3812  				return m.OrderDesc("id")
  3813  			},
  3814  		)
  3815  		all, err := m.All()
  3816  		t.AssertNil(err)
  3817  		t.Assert(len(all), 3)
  3818  		t.Assert(all[0]["id"], 6)
  3819  		t.Assert(all[2]["id"], 4)
  3820  	})
  3821  }
  3822  
  3823  func Test_Model_FieldCount(t *testing.T) {
  3824  	table := createInitTable()
  3825  	defer dropTable(table)
  3826  
  3827  	gtest.C(t, func(t *gtest.T) {
  3828  		all, err := db.Model(table).Fields("id").FieldCount("id", "total").Group("id").OrderAsc("id").All()
  3829  		t.AssertNil(err)
  3830  		t.Assert(len(all), TableSize)
  3831  		t.Assert(all[0]["id"], 1)
  3832  		t.Assert(all[0]["total"], 1)
  3833  	})
  3834  }
  3835  
  3836  func Test_Model_FieldMax(t *testing.T) {
  3837  	table := createInitTable()
  3838  	defer dropTable(table)
  3839  
  3840  	gtest.C(t, func(t *gtest.T) {
  3841  		all, err := db.Model(table).Fields("id").FieldMax("id", "total").Group("id").OrderAsc("id").All()
  3842  		t.AssertNil(err)
  3843  		t.Assert(len(all), TableSize)
  3844  		t.Assert(all[0]["id"], 1)
  3845  		t.Assert(all[0]["total"], 1)
  3846  	})
  3847  }
  3848  
  3849  func Test_Model_FieldMin(t *testing.T) {
  3850  	table := createInitTable()
  3851  	defer dropTable(table)
  3852  
  3853  	gtest.C(t, func(t *gtest.T) {
  3854  		all, err := db.Model(table).Fields("id").FieldMin("id", "total").Group("id").OrderAsc("id").All()
  3855  		t.AssertNil(err)
  3856  		t.Assert(len(all), TableSize)
  3857  		t.Assert(all[0]["id"], 1)
  3858  		t.Assert(all[0]["total"], 1)
  3859  	})
  3860  }
  3861  
  3862  func Test_Model_FieldAvg(t *testing.T) {
  3863  	table := createInitTable()
  3864  	defer dropTable(table)
  3865  
  3866  	gtest.C(t, func(t *gtest.T) {
  3867  		all, err := db.Model(table).Fields("id").FieldAvg("id", "total").Group("id").OrderAsc("id").All()
  3868  		t.AssertNil(err)
  3869  		t.Assert(len(all), TableSize)
  3870  		t.Assert(all[0]["id"], 1)
  3871  		t.Assert(all[0]["total"], 1)
  3872  	})
  3873  }
  3874  
  3875  // https://github.com/gogf/gf/issues/1387
  3876  func Test_Model_GTime_DefaultValue(t *testing.T) {
  3877  	table := createTable()
  3878  	defer dropTable(table)
  3879  
  3880  	gtest.C(t, func(t *gtest.T) {
  3881  		type User struct {
  3882  			Id         int
  3883  			Passport   string
  3884  			Password   string
  3885  			Nickname   string
  3886  			CreateTime *gtime.Time
  3887  		}
  3888  		data := User{
  3889  			Id:       1,
  3890  			Passport: "user_1",
  3891  			Password: "pass_1",
  3892  			Nickname: "name_1",
  3893  		}
  3894  		// Insert
  3895  		_, err := db.Model(table).Data(data).Insert()
  3896  		t.AssertNil(err)
  3897  
  3898  		// Select
  3899  		var (
  3900  			user *User
  3901  		)
  3902  		err = db.Model(table).Scan(&user)
  3903  		t.AssertNil(err)
  3904  		t.Assert(user.Passport, data.Passport)
  3905  		t.Assert(user.Password, data.Password)
  3906  		t.Assert(user.CreateTime, data.CreateTime)
  3907  		t.Assert(user.Nickname, data.Nickname)
  3908  
  3909  		// Insert
  3910  		user.Id = 2
  3911  		_, err = db.Model(table).Data(user).Insert()
  3912  		t.AssertNil(err)
  3913  	})
  3914  }