github.com/gogf/gf@v1.16.9/database/gdb/gdb_z_mysql_method_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  	"fmt"
    12  	"github.com/gogf/gf/container/garray"
    13  	"github.com/gogf/gf/encoding/gparser"
    14  	"github.com/gogf/gf/text/gstr"
    15  	"testing"
    16  	"time"
    17  
    18  	"github.com/gogf/gf/database/gdb"
    19  	"github.com/gogf/gf/encoding/gjson"
    20  	"github.com/gogf/gf/encoding/gxml"
    21  
    22  	"github.com/gogf/gf/frame/g"
    23  	"github.com/gogf/gf/os/gtime"
    24  	"github.com/gogf/gf/test/gtest"
    25  )
    26  
    27  func Test_DB_Ping(t *testing.T) {
    28  	gtest.C(t, func(t *gtest.T) {
    29  		err1 := db.PingMaster()
    30  		err2 := db.PingSlave()
    31  		t.Assert(err1, nil)
    32  		t.Assert(err2, nil)
    33  	})
    34  }
    35  
    36  func Test_DB_Query(t *testing.T) {
    37  	gtest.C(t, func(t *gtest.T) {
    38  		_, err := db.Query("SELECT ?", 1)
    39  		t.AssertNil(err)
    40  
    41  		_, err = db.Query("SELECT ?+?", 1, 2)
    42  		t.AssertNil(err)
    43  
    44  		_, err = db.Query("SELECT ?+?", g.Slice{1, 2})
    45  		t.AssertNil(err)
    46  
    47  		_, err = db.Query("ERROR")
    48  		t.AssertNE(err, nil)
    49  	})
    50  
    51  }
    52  
    53  func Test_DB_Exec(t *testing.T) {
    54  	gtest.C(t, func(t *gtest.T) {
    55  		_, err := db.Exec("SELECT ?", 1)
    56  		t.AssertNil(err)
    57  
    58  		_, err = db.Exec("ERROR")
    59  		t.AssertNE(err, nil)
    60  	})
    61  
    62  }
    63  
    64  func Test_DB_Prepare(t *testing.T) {
    65  	gtest.C(t, func(t *gtest.T) {
    66  		st, err := db.Prepare("SELECT 100")
    67  		t.AssertNil(err)
    68  
    69  		rows, err := st.Query()
    70  		t.AssertNil(err)
    71  
    72  		array, err := rows.Columns()
    73  		t.AssertNil(err)
    74  		t.Assert(array[0], "100")
    75  
    76  		err = rows.Close()
    77  		t.AssertNil(err)
    78  	})
    79  }
    80  
    81  func Test_DB_Insert(t *testing.T) {
    82  	table := createTable()
    83  	defer dropTable(table)
    84  
    85  	gtest.C(t, func(t *gtest.T) {
    86  		_, err := db.Insert(table, g.Map{
    87  			"id":          1,
    88  			"passport":    "t1",
    89  			"password":    "25d55ad283aa400af464c76d713c07ad",
    90  			"nickname":    "T1",
    91  			"create_time": gtime.Now().String(),
    92  		})
    93  		t.AssertNil(err)
    94  
    95  		// normal map
    96  		result, err := db.Insert(table, g.Map{
    97  			"id":          "2",
    98  			"passport":    "t2",
    99  			"password":    "25d55ad283aa400af464c76d713c07ad",
   100  			"nickname":    "name_2",
   101  			"create_time": gtime.Now().String(),
   102  		})
   103  		t.AssertNil(err)
   104  		n, _ := result.RowsAffected()
   105  		t.Assert(n, 1)
   106  
   107  		// struct
   108  		type User struct {
   109  			Id         int    `gconv:"id"`
   110  			Passport   string `json:"passport"`
   111  			Password   string `gconv:"password"`
   112  			Nickname   string `gconv:"nickname"`
   113  			CreateTime string `json:"create_time"`
   114  		}
   115  		timeStr := gtime.Now().String()
   116  		result, err = db.Insert(table, User{
   117  			Id:         3,
   118  			Passport:   "user_3",
   119  			Password:   "25d55ad283aa400af464c76d713c07ad",
   120  			Nickname:   "name_3",
   121  			CreateTime: timeStr,
   122  		})
   123  		t.AssertNil(err)
   124  		n, _ = result.RowsAffected()
   125  		t.Assert(n, 1)
   126  
   127  		one, err := db.Model(table).Where("id", 3).One()
   128  		t.AssertNil(err)
   129  
   130  		t.Assert(one["id"].Int(), 3)
   131  		t.Assert(one["passport"].String(), "user_3")
   132  		t.Assert(one["password"].String(), "25d55ad283aa400af464c76d713c07ad")
   133  		t.Assert(one["nickname"].String(), "name_3")
   134  		t.Assert(one["create_time"].GTime().String(), timeStr)
   135  
   136  		// *struct
   137  		timeStr = gtime.Now().String()
   138  		result, err = db.Insert(table, &User{
   139  			Id:         4,
   140  			Passport:   "t4",
   141  			Password:   "25d55ad283aa400af464c76d713c07ad",
   142  			Nickname:   "name_4",
   143  			CreateTime: timeStr,
   144  		})
   145  		t.AssertNil(err)
   146  		n, _ = result.RowsAffected()
   147  		t.Assert(n, 1)
   148  
   149  		one, err = db.Model(table).Where("id", 4).One()
   150  		t.AssertNil(err)
   151  		t.Assert(one["id"].Int(), 4)
   152  		t.Assert(one["passport"].String(), "t4")
   153  		t.Assert(one["password"].String(), "25d55ad283aa400af464c76d713c07ad")
   154  		t.Assert(one["nickname"].String(), "name_4")
   155  		t.Assert(one["create_time"].GTime().String(), timeStr)
   156  
   157  		// batch with Insert
   158  		timeStr = gtime.Now().String()
   159  		r, err := db.Insert(table, g.Slice{
   160  			g.Map{
   161  				"id":          200,
   162  				"passport":    "t200",
   163  				"password":    "25d55ad283aa400af464c76d71qw07ad",
   164  				"nickname":    "T200",
   165  				"create_time": timeStr,
   166  			},
   167  			g.Map{
   168  				"id":          300,
   169  				"passport":    "t300",
   170  				"password":    "25d55ad283aa400af464c76d713c07ad",
   171  				"nickname":    "T300",
   172  				"create_time": timeStr,
   173  			},
   174  		})
   175  		t.AssertNil(err)
   176  		n, _ = r.RowsAffected()
   177  		t.Assert(n, 2)
   178  
   179  		one, err = db.Model(table).Where("id", 200).One()
   180  		t.AssertNil(err)
   181  		t.Assert(one["id"].Int(), 200)
   182  		t.Assert(one["passport"].String(), "t200")
   183  		t.Assert(one["password"].String(), "25d55ad283aa400af464c76d71qw07ad")
   184  		t.Assert(one["nickname"].String(), "T200")
   185  		t.Assert(one["create_time"].GTime().String(), timeStr)
   186  	})
   187  }
   188  
   189  // Fix issue: https://github.com/gogf/gf/issues/819
   190  func Test_DB_Insert_WithStructAndSliceAttribute(t *testing.T) {
   191  	table := createTable()
   192  	defer dropTable(table)
   193  
   194  	gtest.C(t, func(t *gtest.T) {
   195  		type Password struct {
   196  			Salt string `json:"salt"`
   197  			Pass string `json:"pass"`
   198  		}
   199  		data := g.Map{
   200  			"id":          1,
   201  			"passport":    "t1",
   202  			"password":    &Password{"123", "456"},
   203  			"nickname":    []string{"A", "B", "C"},
   204  			"create_time": gtime.Now().String(),
   205  		}
   206  		_, err := db.Insert(table, data)
   207  		t.AssertNil(err)
   208  
   209  		one, err := db.GetOne(fmt.Sprintf("SELECT * FROM %s WHERE id=?", table), 1)
   210  		t.AssertNil(err)
   211  		t.Assert(one["passport"], data["passport"])
   212  		t.Assert(one["create_time"], data["create_time"])
   213  		t.Assert(one["nickname"], gparser.MustToJson(data["nickname"]))
   214  	})
   215  }
   216  
   217  func Test_DB_Insert_KeyFieldNameMapping(t *testing.T) {
   218  	table := createTable()
   219  	defer dropTable(table)
   220  
   221  	gtest.C(t, func(t *gtest.T) {
   222  		type User struct {
   223  			Id         int
   224  			Passport   string
   225  			Password   string
   226  			Nickname   string
   227  			CreateTime string
   228  		}
   229  		data := User{
   230  			Id:         1,
   231  			Passport:   "user_1",
   232  			Password:   "pass_1",
   233  			Nickname:   "name_1",
   234  			CreateTime: "2020-10-10 12:00:01",
   235  		}
   236  		_, err := db.Insert(table, data)
   237  		t.AssertNil(err)
   238  
   239  		one, err := db.GetOne(fmt.Sprintf("SELECT * FROM %s WHERE id=?", table), 1)
   240  		t.AssertNil(err)
   241  		t.Assert(one["passport"], data.Passport)
   242  		t.Assert(one["create_time"], data.CreateTime)
   243  		t.Assert(one["nickname"], data.Nickname)
   244  	})
   245  }
   246  
   247  func Test_DB_Upadte_KeyFieldNameMapping(t *testing.T) {
   248  	table := createInitTable()
   249  	defer dropTable(table)
   250  
   251  	gtest.C(t, func(t *gtest.T) {
   252  		type User struct {
   253  			Id         int
   254  			Passport   string
   255  			Password   string
   256  			Nickname   string
   257  			CreateTime string
   258  		}
   259  		data := User{
   260  			Id:         1,
   261  			Passport:   "user_10",
   262  			Password:   "pass_10",
   263  			Nickname:   "name_10",
   264  			CreateTime: "2020-10-10 12:00:01",
   265  		}
   266  		_, err := db.Update(table, data, "id=1")
   267  		t.AssertNil(err)
   268  
   269  		one, err := db.GetOne(fmt.Sprintf("SELECT * FROM %s WHERE id=?", table), 1)
   270  		t.AssertNil(err)
   271  		t.Assert(one["passport"], data.Passport)
   272  		t.Assert(one["create_time"], data.CreateTime)
   273  		t.Assert(one["nickname"], data.Nickname)
   274  	})
   275  }
   276  
   277  // This is no longer used as the filter feature is automatically enabled from GoFrame v1.16.0.
   278  //func Test_DB_Insert_KeyFieldNameMapping_Error(t *testing.T) {
   279  //	table := createTable()
   280  //	defer dropTable(table)
   281  //
   282  //	gtest.C(t, func(t *gtest.T) {
   283  //		type User struct {
   284  //			Id             int
   285  //			Passport       string
   286  //			Password       string
   287  //			Nickname       string
   288  //			CreateTime     string
   289  //			NoneExistField string
   290  //		}
   291  //		data := User{
   292  //			Id:         1,
   293  //			Passport:   "user_1",
   294  //			Password:   "pass_1",
   295  //			Nickname:   "name_1",
   296  //			CreateTime: "2020-10-10 12:00:01",
   297  //		}
   298  //		_, err := db.Insert(table, data)
   299  //		t.AssertNE(err, nil)
   300  //	})
   301  //}
   302  
   303  func Test_DB_InsertIgnore(t *testing.T) {
   304  	table := createInitTable()
   305  	defer dropTable(table)
   306  	gtest.C(t, func(t *gtest.T) {
   307  		_, err := db.Insert(table, g.Map{
   308  			"id":          1,
   309  			"passport":    "t1",
   310  			"password":    "25d55ad283aa400af464c76d713c07ad",
   311  			"nickname":    "T1",
   312  			"create_time": gtime.Now().String(),
   313  		})
   314  		t.AssertNE(err, nil)
   315  	})
   316  	gtest.C(t, func(t *gtest.T) {
   317  		_, err := db.InsertIgnore(table, g.Map{
   318  			"id":          1,
   319  			"passport":    "t1",
   320  			"password":    "25d55ad283aa400af464c76d713c07ad",
   321  			"nickname":    "T1",
   322  			"create_time": gtime.Now().String(),
   323  		})
   324  		t.AssertNil(err)
   325  	})
   326  }
   327  
   328  func Test_DB_BatchInsert(t *testing.T) {
   329  	gtest.C(t, func(t *gtest.T) {
   330  		table := createTable()
   331  		defer dropTable(table)
   332  		r, err := db.Insert(table, g.List{
   333  			{
   334  				"id":          2,
   335  				"passport":    "t2",
   336  				"password":    "25d55ad283aa400af464c76d713c07ad",
   337  				"nickname":    "name_2",
   338  				"create_time": gtime.Now().String(),
   339  			},
   340  			{
   341  				"id":          3,
   342  				"passport":    "user_3",
   343  				"password":    "25d55ad283aa400af464c76d713c07ad",
   344  				"nickname":    "name_3",
   345  				"create_time": gtime.Now().String(),
   346  			},
   347  		}, 1)
   348  		t.AssertNil(err)
   349  		n, _ := r.RowsAffected()
   350  		t.Assert(n, 2)
   351  
   352  		n, _ = r.LastInsertId()
   353  		t.Assert(n, 3)
   354  	})
   355  
   356  	gtest.C(t, func(t *gtest.T) {
   357  		table := createTable()
   358  		defer dropTable(table)
   359  		// []interface{}
   360  		r, err := db.Insert(table, g.Slice{
   361  			g.Map{
   362  				"id":          2,
   363  				"passport":    "t2",
   364  				"password":    "25d55ad283aa400af464c76d713c07ad",
   365  				"nickname":    "name_2",
   366  				"create_time": gtime.Now().String(),
   367  			},
   368  			g.Map{
   369  				"id":          3,
   370  				"passport":    "user_3",
   371  				"password":    "25d55ad283aa400af464c76d713c07ad",
   372  				"nickname":    "name_3",
   373  				"create_time": gtime.Now().String(),
   374  			},
   375  		}, 1)
   376  		t.AssertNil(err)
   377  		n, _ := r.RowsAffected()
   378  		t.Assert(n, 2)
   379  	})
   380  
   381  	// batch insert map
   382  	gtest.C(t, func(t *gtest.T) {
   383  		table := createTable()
   384  		defer dropTable(table)
   385  		result, err := db.Insert(table, g.Map{
   386  			"id":          1,
   387  			"passport":    "t1",
   388  			"password":    "p1",
   389  			"nickname":    "T1",
   390  			"create_time": gtime.Now().String(),
   391  		})
   392  		t.AssertNil(err)
   393  		n, _ := result.RowsAffected()
   394  		t.Assert(n, 1)
   395  	})
   396  
   397  }
   398  
   399  func Test_DB_BatchInsert_Struct(t *testing.T) {
   400  	// batch insert struct
   401  	gtest.C(t, func(t *gtest.T) {
   402  		table := createTable()
   403  		defer dropTable(table)
   404  
   405  		type User struct {
   406  			Id         int         `c:"id"`
   407  			Passport   string      `c:"passport"`
   408  			Password   string      `c:"password"`
   409  			NickName   string      `c:"nickname"`
   410  			CreateTime *gtime.Time `c:"create_time"`
   411  		}
   412  		user := &User{
   413  			Id:         1,
   414  			Passport:   "t1",
   415  			Password:   "p1",
   416  			NickName:   "T1",
   417  			CreateTime: gtime.Now(),
   418  		}
   419  		result, err := db.Insert(table, user)
   420  		t.AssertNil(err)
   421  		n, _ := result.RowsAffected()
   422  		t.Assert(n, 1)
   423  	})
   424  }
   425  
   426  func Test_DB_Save(t *testing.T) {
   427  	table := createInitTable()
   428  	defer dropTable(table)
   429  
   430  	gtest.C(t, func(t *gtest.T) {
   431  		timeStr := gtime.Now().String()
   432  		_, err := db.Save(table, g.Map{
   433  			"id":          1,
   434  			"passport":    "t1",
   435  			"password":    "25d55ad283aa400af464c76d713c07ad",
   436  			"nickname":    "T11",
   437  			"create_time": timeStr,
   438  		})
   439  		t.AssertNil(err)
   440  
   441  		one, err := db.Model(table).Where("id", 1).One()
   442  		t.AssertNil(err)
   443  		t.Assert(one["id"].Int(), 1)
   444  		t.Assert(one["passport"].String(), "t1")
   445  		t.Assert(one["password"].String(), "25d55ad283aa400af464c76d713c07ad")
   446  		t.Assert(one["nickname"].String(), "T11")
   447  		t.Assert(one["create_time"].GTime().String(), timeStr)
   448  	})
   449  }
   450  
   451  func Test_DB_Replace(t *testing.T) {
   452  	table := createInitTable()
   453  	defer dropTable(table)
   454  
   455  	gtest.C(t, func(t *gtest.T) {
   456  		timeStr := gtime.Now().String()
   457  		_, err := db.Replace(table, g.Map{
   458  			"id":          1,
   459  			"passport":    "t1",
   460  			"password":    "25d55ad283aa400af464c76d713c07ad",
   461  			"nickname":    "T11",
   462  			"create_time": timeStr,
   463  		})
   464  		t.AssertNil(err)
   465  
   466  		one, err := db.Model(table).Where("id", 1).One()
   467  		t.AssertNil(err)
   468  		t.Assert(one["id"].Int(), 1)
   469  		t.Assert(one["passport"].String(), "t1")
   470  		t.Assert(one["password"].String(), "25d55ad283aa400af464c76d713c07ad")
   471  		t.Assert(one["nickname"].String(), "T11")
   472  		t.Assert(one["create_time"].GTime().String(), timeStr)
   473  	})
   474  }
   475  
   476  func Test_DB_Update(t *testing.T) {
   477  	table := createInitTable()
   478  	defer dropTable(table)
   479  
   480  	gtest.C(t, func(t *gtest.T) {
   481  		result, err := db.Update(table, "password='987654321'", "id=3")
   482  		t.AssertNil(err)
   483  		n, _ := result.RowsAffected()
   484  		t.Assert(n, 1)
   485  
   486  		one, err := db.Model(table).Where("id", 3).One()
   487  		t.AssertNil(err)
   488  		t.Assert(one["id"].Int(), 3)
   489  		t.Assert(one["passport"].String(), "user_3")
   490  		t.Assert(one["password"].String(), "987654321")
   491  		t.Assert(one["nickname"].String(), "name_3")
   492  	})
   493  }
   494  
   495  func Test_DB_GetAll(t *testing.T) {
   496  	table := createInitTable()
   497  	defer dropTable(table)
   498  
   499  	gtest.C(t, func(t *gtest.T) {
   500  		result, err := db.GetAll(fmt.Sprintf("SELECT * FROM %s WHERE id=?", table), 1)
   501  		t.AssertNil(err)
   502  		t.Assert(len(result), 1)
   503  		t.Assert(result[0]["id"].Int(), 1)
   504  	})
   505  	gtest.C(t, func(t *gtest.T) {
   506  		result, err := db.GetAll(fmt.Sprintf("SELECT * FROM %s WHERE id=?", table), g.Slice{1})
   507  		t.AssertNil(err)
   508  		t.Assert(len(result), 1)
   509  		t.Assert(result[0]["id"].Int(), 1)
   510  	})
   511  	gtest.C(t, func(t *gtest.T) {
   512  		result, err := db.GetAll(fmt.Sprintf("SELECT * FROM %s WHERE id in(?)", table), g.Slice{1, 2, 3})
   513  		t.AssertNil(err)
   514  		t.Assert(len(result), 3)
   515  		t.Assert(result[0]["id"].Int(), 1)
   516  		t.Assert(result[1]["id"].Int(), 2)
   517  		t.Assert(result[2]["id"].Int(), 3)
   518  	})
   519  	gtest.C(t, func(t *gtest.T) {
   520  		result, err := db.GetAll(fmt.Sprintf("SELECT * FROM %s WHERE id in(?,?,?)", table), g.Slice{1, 2, 3})
   521  		t.AssertNil(err)
   522  		t.Assert(len(result), 3)
   523  		t.Assert(result[0]["id"].Int(), 1)
   524  		t.Assert(result[1]["id"].Int(), 2)
   525  		t.Assert(result[2]["id"].Int(), 3)
   526  	})
   527  	gtest.C(t, func(t *gtest.T) {
   528  		result, err := db.GetAll(fmt.Sprintf("SELECT * FROM %s WHERE id in(?,?,?)", table), g.Slice{1, 2, 3}...)
   529  		t.AssertNil(err)
   530  		t.Assert(len(result), 3)
   531  		t.Assert(result[0]["id"].Int(), 1)
   532  		t.Assert(result[1]["id"].Int(), 2)
   533  		t.Assert(result[2]["id"].Int(), 3)
   534  	})
   535  	gtest.C(t, func(t *gtest.T) {
   536  		result, err := db.GetAll(fmt.Sprintf("SELECT * FROM %s WHERE id>=? AND id <=?", table), g.Slice{1, 3})
   537  		t.AssertNil(err)
   538  		t.Assert(len(result), 3)
   539  		t.Assert(result[0]["id"].Int(), 1)
   540  		t.Assert(result[1]["id"].Int(), 2)
   541  		t.Assert(result[2]["id"].Int(), 3)
   542  	})
   543  }
   544  
   545  func Test_DB_GetOne(t *testing.T) {
   546  	table := createInitTable()
   547  	defer dropTable(table)
   548  	gtest.C(t, func(t *gtest.T) {
   549  		record, err := db.GetOne(fmt.Sprintf("SELECT * FROM %s WHERE passport=?", table), "user_1")
   550  		t.AssertNil(err)
   551  		t.Assert(record["nickname"].String(), "name_1")
   552  	})
   553  }
   554  
   555  func Test_DB_GetValue(t *testing.T) {
   556  	table := createInitTable()
   557  	defer dropTable(table)
   558  	gtest.C(t, func(t *gtest.T) {
   559  		value, err := db.GetValue(fmt.Sprintf("SELECT id FROM %s WHERE passport=?", table), "user_3")
   560  		t.AssertNil(err)
   561  		t.Assert(value.Int(), 3)
   562  	})
   563  }
   564  
   565  func Test_DB_GetCount(t *testing.T) {
   566  	table := createInitTable()
   567  	defer dropTable(table)
   568  	gtest.C(t, func(t *gtest.T) {
   569  		count, err := db.GetCount(fmt.Sprintf("SELECT * FROM %s", table))
   570  		t.AssertNil(err)
   571  		t.Assert(count, TableSize)
   572  	})
   573  }
   574  
   575  func Test_DB_GetStruct(t *testing.T) {
   576  	table := createInitTable()
   577  	defer dropTable(table)
   578  	gtest.C(t, func(t *gtest.T) {
   579  		type User struct {
   580  			Id         int
   581  			Passport   string
   582  			Password   string
   583  			NickName   string
   584  			CreateTime gtime.Time
   585  		}
   586  		user := new(User)
   587  		err := db.GetScan(user, fmt.Sprintf("SELECT * FROM %s WHERE id=?", table), 3)
   588  		t.AssertNil(err)
   589  		t.Assert(user.NickName, "name_3")
   590  	})
   591  	gtest.C(t, func(t *gtest.T) {
   592  		type User struct {
   593  			Id         int
   594  			Passport   string
   595  			Password   string
   596  			NickName   string
   597  			CreateTime *gtime.Time
   598  		}
   599  		user := new(User)
   600  		err := db.GetScan(user, fmt.Sprintf("SELECT * FROM %s WHERE id=?", table), 3)
   601  		t.AssertNil(err)
   602  		t.Assert(user.NickName, "name_3")
   603  	})
   604  }
   605  
   606  func Test_DB_GetStructs(t *testing.T) {
   607  	table := createInitTable()
   608  	defer dropTable(table)
   609  	gtest.C(t, func(t *gtest.T) {
   610  		type User struct {
   611  			Id         int
   612  			Passport   string
   613  			Password   string
   614  			NickName   string
   615  			CreateTime gtime.Time
   616  		}
   617  		var users []User
   618  		err := db.GetScan(&users, fmt.Sprintf("SELECT * FROM %s WHERE id>?", table), 1)
   619  		t.AssertNil(err)
   620  		t.Assert(len(users), TableSize-1)
   621  		t.Assert(users[0].Id, 2)
   622  		t.Assert(users[1].Id, 3)
   623  		t.Assert(users[2].Id, 4)
   624  		t.Assert(users[0].NickName, "name_2")
   625  		t.Assert(users[1].NickName, "name_3")
   626  		t.Assert(users[2].NickName, "name_4")
   627  	})
   628  
   629  	gtest.C(t, func(t *gtest.T) {
   630  		type User struct {
   631  			Id         int
   632  			Passport   string
   633  			Password   string
   634  			NickName   string
   635  			CreateTime *gtime.Time
   636  		}
   637  		var users []User
   638  		err := db.GetScan(&users, fmt.Sprintf("SELECT * FROM %s WHERE id>?", table), 1)
   639  		t.AssertNil(err)
   640  		t.Assert(len(users), TableSize-1)
   641  		t.Assert(users[0].Id, 2)
   642  		t.Assert(users[1].Id, 3)
   643  		t.Assert(users[2].Id, 4)
   644  		t.Assert(users[0].NickName, "name_2")
   645  		t.Assert(users[1].NickName, "name_3")
   646  		t.Assert(users[2].NickName, "name_4")
   647  	})
   648  }
   649  
   650  func Test_DB_GetScan(t *testing.T) {
   651  	table := createInitTable()
   652  	defer dropTable(table)
   653  	gtest.C(t, func(t *gtest.T) {
   654  		type User struct {
   655  			Id         int
   656  			Passport   string
   657  			Password   string
   658  			NickName   string
   659  			CreateTime gtime.Time
   660  		}
   661  		user := new(User)
   662  		err := db.GetScan(user, fmt.Sprintf("SELECT * FROM %s WHERE id=?", table), 3)
   663  		t.AssertNil(err)
   664  		t.Assert(user.NickName, "name_3")
   665  	})
   666  	gtest.C(t, func(t *gtest.T) {
   667  		type User struct {
   668  			Id         int
   669  			Passport   string
   670  			Password   string
   671  			NickName   string
   672  			CreateTime *gtime.Time
   673  		}
   674  		user := new(User)
   675  		err := db.GetScan(user, fmt.Sprintf("SELECT * FROM %s WHERE id=?", table), 3)
   676  		t.AssertNil(err)
   677  		t.Assert(user.NickName, "name_3")
   678  	})
   679  
   680  	gtest.C(t, func(t *gtest.T) {
   681  		type User struct {
   682  			Id         int
   683  			Passport   string
   684  			Password   string
   685  			NickName   string
   686  			CreateTime gtime.Time
   687  		}
   688  		var users []User
   689  		err := db.GetScan(&users, fmt.Sprintf("SELECT * FROM %s WHERE id>?", table), 1)
   690  		t.AssertNil(err)
   691  		t.Assert(len(users), TableSize-1)
   692  		t.Assert(users[0].Id, 2)
   693  		t.Assert(users[1].Id, 3)
   694  		t.Assert(users[2].Id, 4)
   695  		t.Assert(users[0].NickName, "name_2")
   696  		t.Assert(users[1].NickName, "name_3")
   697  		t.Assert(users[2].NickName, "name_4")
   698  	})
   699  
   700  	gtest.C(t, func(t *gtest.T) {
   701  		type User struct {
   702  			Id         int
   703  			Passport   string
   704  			Password   string
   705  			NickName   string
   706  			CreateTime *gtime.Time
   707  		}
   708  		var users []User
   709  		err := db.GetScan(&users, fmt.Sprintf("SELECT * FROM %s WHERE id>?", table), 1)
   710  		t.AssertNil(err)
   711  		t.Assert(len(users), TableSize-1)
   712  		t.Assert(users[0].Id, 2)
   713  		t.Assert(users[1].Id, 3)
   714  		t.Assert(users[2].Id, 4)
   715  		t.Assert(users[0].NickName, "name_2")
   716  		t.Assert(users[1].NickName, "name_3")
   717  		t.Assert(users[2].NickName, "name_4")
   718  	})
   719  }
   720  
   721  func Test_DB_Delete(t *testing.T) {
   722  	table := createInitTable()
   723  	defer dropTable(table)
   724  	gtest.C(t, func(t *gtest.T) {
   725  		result, err := db.Delete(table, 1)
   726  		t.AssertNil(err)
   727  		n, _ := result.RowsAffected()
   728  		t.Assert(n, TableSize)
   729  	})
   730  }
   731  
   732  func Test_DB_Time(t *testing.T) {
   733  	table := createTable()
   734  	defer dropTable(table)
   735  
   736  	gtest.C(t, func(t *gtest.T) {
   737  		result, err := db.Insert(table, g.Map{
   738  			"id":          200,
   739  			"passport":    "t200",
   740  			"password":    "123456",
   741  			"nickname":    "T200",
   742  			"create_time": time.Now(),
   743  		})
   744  		if err != nil {
   745  			gtest.Error(err)
   746  		}
   747  		n, _ := result.RowsAffected()
   748  		t.Assert(n, 1)
   749  		value, err := db.GetValue(fmt.Sprintf("select `passport` from `%s` where id=?", table), 200)
   750  		t.AssertNil(err)
   751  		t.Assert(value.String(), "t200")
   752  	})
   753  
   754  	gtest.C(t, func(t *gtest.T) {
   755  		t1 := time.Now()
   756  		result, err := db.Insert(table, g.Map{
   757  			"id":          300,
   758  			"passport":    "t300",
   759  			"password":    "123456",
   760  			"nickname":    "T300",
   761  			"create_time": &t1,
   762  		})
   763  		if err != nil {
   764  			gtest.Error(err)
   765  		}
   766  		n, _ := result.RowsAffected()
   767  		t.Assert(n, 1)
   768  		value, err := db.GetValue(fmt.Sprintf("select `passport` from `%s` where id=?", table), 300)
   769  		t.AssertNil(err)
   770  		t.Assert(value.String(), "t300")
   771  	})
   772  
   773  	gtest.C(t, func(t *gtest.T) {
   774  		result, err := db.Delete(table, 1)
   775  		t.AssertNil(err)
   776  		n, _ := result.RowsAffected()
   777  		t.Assert(n, 2)
   778  	})
   779  }
   780  
   781  func Test_DB_ToJson(t *testing.T) {
   782  	table := createInitTable()
   783  	defer dropTable(table)
   784  	_, err := db.Update(table, "create_time='2010-10-10 00:00:01'", "id=?", 1)
   785  	gtest.AssertNil(err)
   786  
   787  	gtest.C(t, func(t *gtest.T) {
   788  		result, err := db.Model(table).Fields("*").Where("id =? ", 1).Select()
   789  		if err != nil {
   790  			gtest.Fatal(err)
   791  		}
   792  
   793  		type User struct {
   794  			Id         int
   795  			Passport   string
   796  			Password   string
   797  			NickName   string
   798  			CreateTime string
   799  		}
   800  
   801  		users := make([]User, 0)
   802  
   803  		err = result.Structs(users)
   804  		t.AssertNE(err, nil)
   805  
   806  		err = result.Structs(&users)
   807  		if err != nil {
   808  			gtest.Fatal(err)
   809  		}
   810  
   811  		//ToJson
   812  		resultJson, err := gjson.LoadContent(result.Json())
   813  		if err != nil {
   814  			gtest.Fatal(err)
   815  		}
   816  
   817  		t.Assert(users[0].Id, resultJson.GetInt("0.id"))
   818  		t.Assert(users[0].Passport, resultJson.GetString("0.passport"))
   819  		t.Assert(users[0].Password, resultJson.GetString("0.password"))
   820  		t.Assert(users[0].NickName, resultJson.GetString("0.nickname"))
   821  		t.Assert(users[0].CreateTime, resultJson.GetString("0.create_time"))
   822  
   823  		result = nil
   824  		err = result.Structs(&users)
   825  		t.AssertNil(err)
   826  	})
   827  
   828  	gtest.C(t, func(t *gtest.T) {
   829  		result, err := db.Model(table).Fields("*").Where("id =? ", 1).One()
   830  		if err != nil {
   831  			gtest.Fatal(err)
   832  		}
   833  
   834  		type User struct {
   835  			Id         int
   836  			Passport   string
   837  			Password   string
   838  			NickName   string
   839  			CreateTime string
   840  		}
   841  
   842  		users := User{}
   843  
   844  		err = result.Struct(&users)
   845  		if err != nil {
   846  			gtest.Fatal(err)
   847  		}
   848  
   849  		result = nil
   850  		err = result.Struct(&users)
   851  		t.AssertNE(err, nil)
   852  	})
   853  }
   854  
   855  func Test_DB_ToXml(t *testing.T) {
   856  	table := createInitTable()
   857  	defer dropTable(table)
   858  	_, err := db.Update(table, "create_time='2010-10-10 00:00:01'", "id=?", 1)
   859  	gtest.AssertNil(err)
   860  
   861  	gtest.C(t, func(t *gtest.T) {
   862  		record, err := db.Model(table).Fields("*").Where("id = ?", 1).One()
   863  		if err != nil {
   864  			gtest.Fatal(err)
   865  		}
   866  
   867  		type User struct {
   868  			Id         int
   869  			Passport   string
   870  			Password   string
   871  			NickName   string
   872  			CreateTime string
   873  		}
   874  
   875  		user := User{}
   876  		err = record.Struct(&user)
   877  		if err != nil {
   878  			gtest.Fatal(err)
   879  		}
   880  
   881  		result, err := gxml.Decode([]byte(record.Xml("doc")))
   882  		if err != nil {
   883  			gtest.Fatal(err)
   884  		}
   885  
   886  		resultXml := result["doc"].(map[string]interface{})
   887  		if v, ok := resultXml["id"]; ok {
   888  			t.Assert(user.Id, v)
   889  		} else {
   890  			gtest.Fatal("FAIL")
   891  		}
   892  
   893  		if v, ok := resultXml["passport"]; ok {
   894  			t.Assert(user.Passport, v)
   895  		} else {
   896  			gtest.Fatal("FAIL")
   897  		}
   898  
   899  		if v, ok := resultXml["password"]; ok {
   900  			t.Assert(user.Password, v)
   901  		} else {
   902  			gtest.Fatal("FAIL")
   903  		}
   904  
   905  		if v, ok := resultXml["nickname"]; ok {
   906  			t.Assert(user.NickName, v)
   907  		} else {
   908  			gtest.Fatal("FAIL")
   909  		}
   910  
   911  		if v, ok := resultXml["create_time"]; ok {
   912  			t.Assert(user.CreateTime, v)
   913  		} else {
   914  			gtest.Fatal("FAIL")
   915  		}
   916  
   917  	})
   918  }
   919  
   920  func Test_DB_ToStringMap(t *testing.T) {
   921  
   922  	table := createInitTable()
   923  	defer dropTable(table)
   924  	_, err := db.Update(table, "create_time='2010-10-10 00:00:01'", "id=?", 1)
   925  	gtest.AssertNil(err)
   926  	gtest.C(t, func(t *gtest.T) {
   927  		id := "1"
   928  		result, err := db.Model(table).Fields("*").Where("id = ?", 1).Select()
   929  		if err != nil {
   930  			gtest.Fatal(err)
   931  		}
   932  
   933  		type t_user struct {
   934  			Id         int
   935  			Passport   string
   936  			Password   string
   937  			NickName   string
   938  			CreateTime string
   939  		}
   940  
   941  		t_users := make([]t_user, 0)
   942  		err = result.Structs(&t_users)
   943  		if err != nil {
   944  			gtest.Fatal(err)
   945  		}
   946  
   947  		resultStringMap := result.MapKeyStr("id")
   948  		t.Assert(t_users[0].Id, resultStringMap[id]["id"])
   949  		t.Assert(t_users[0].Passport, resultStringMap[id]["passport"])
   950  		t.Assert(t_users[0].Password, resultStringMap[id]["password"])
   951  		t.Assert(t_users[0].NickName, resultStringMap[id]["nickname"])
   952  		t.Assert(t_users[0].CreateTime, resultStringMap[id]["create_time"])
   953  	})
   954  }
   955  
   956  func Test_DB_ToIntMap(t *testing.T) {
   957  
   958  	table := createInitTable()
   959  	defer dropTable(table)
   960  	_, err := db.Update(table, "create_time='2010-10-10 00:00:01'", "id=?", 1)
   961  	gtest.AssertNil(err)
   962  
   963  	gtest.C(t, func(t *gtest.T) {
   964  		id := 1
   965  		result, err := db.Model(table).Fields("*").Where("id = ?", id).Select()
   966  		if err != nil {
   967  			gtest.Fatal(err)
   968  		}
   969  
   970  		type t_user struct {
   971  			Id         int
   972  			Passport   string
   973  			Password   string
   974  			NickName   string
   975  			CreateTime string
   976  		}
   977  
   978  		t_users := make([]t_user, 0)
   979  		err = result.Structs(&t_users)
   980  		if err != nil {
   981  			gtest.Fatal(err)
   982  		}
   983  
   984  		resultIntMap := result.MapKeyInt("id")
   985  		t.Assert(t_users[0].Id, resultIntMap[id]["id"])
   986  		t.Assert(t_users[0].Passport, resultIntMap[id]["passport"])
   987  		t.Assert(t_users[0].Password, resultIntMap[id]["password"])
   988  		t.Assert(t_users[0].NickName, resultIntMap[id]["nickname"])
   989  		t.Assert(t_users[0].CreateTime, resultIntMap[id]["create_time"])
   990  	})
   991  }
   992  
   993  func Test_DB_ToUintMap(t *testing.T) {
   994  	table := createInitTable()
   995  	defer dropTable(table)
   996  	_, err := db.Update(table, "create_time='2010-10-10 00:00:01'", "id=?", 1)
   997  	gtest.AssertNil(err)
   998  
   999  	gtest.C(t, func(t *gtest.T) {
  1000  		id := 1
  1001  		result, err := db.Model(table).Fields("*").Where("id = ?", id).Select()
  1002  		if err != nil {
  1003  			gtest.Fatal(err)
  1004  		}
  1005  
  1006  		type t_user struct {
  1007  			Id         int
  1008  			Passport   string
  1009  			Password   string
  1010  			NickName   string
  1011  			CreateTime string
  1012  		}
  1013  
  1014  		t_users := make([]t_user, 0)
  1015  		err = result.Structs(&t_users)
  1016  		if err != nil {
  1017  			gtest.Fatal(err)
  1018  		}
  1019  
  1020  		resultUintMap := result.MapKeyUint("id")
  1021  		t.Assert(t_users[0].Id, resultUintMap[uint(id)]["id"])
  1022  		t.Assert(t_users[0].Passport, resultUintMap[uint(id)]["passport"])
  1023  		t.Assert(t_users[0].Password, resultUintMap[uint(id)]["password"])
  1024  		t.Assert(t_users[0].NickName, resultUintMap[uint(id)]["nickname"])
  1025  		t.Assert(t_users[0].CreateTime, resultUintMap[uint(id)]["create_time"])
  1026  
  1027  	})
  1028  }
  1029  
  1030  func Test_DB_ToStringRecord(t *testing.T) {
  1031  	table := createInitTable()
  1032  	defer dropTable(table)
  1033  	_, err := db.Update(table, "create_time='2010-10-10 00:00:01'", "id=?", 1)
  1034  	gtest.AssertNil(err)
  1035  
  1036  	gtest.C(t, func(t *gtest.T) {
  1037  		id := 1
  1038  		ids := "1"
  1039  		result, err := db.Model(table).Fields("*").Where("id = ?", id).Select()
  1040  		if err != nil {
  1041  			gtest.Fatal(err)
  1042  		}
  1043  
  1044  		type t_user struct {
  1045  			Id         int
  1046  			Passport   string
  1047  			Password   string
  1048  			NickName   string
  1049  			CreateTime string
  1050  		}
  1051  
  1052  		t_users := make([]t_user, 0)
  1053  		err = result.Structs(&t_users)
  1054  		if err != nil {
  1055  			gtest.Fatal(err)
  1056  		}
  1057  
  1058  		resultStringRecord := result.RecordKeyStr("id")
  1059  		t.Assert(t_users[0].Id, resultStringRecord[ids]["id"].Int())
  1060  		t.Assert(t_users[0].Passport, resultStringRecord[ids]["passport"].String())
  1061  		t.Assert(t_users[0].Password, resultStringRecord[ids]["password"].String())
  1062  		t.Assert(t_users[0].NickName, resultStringRecord[ids]["nickname"].String())
  1063  		t.Assert(t_users[0].CreateTime, resultStringRecord[ids]["create_time"].String())
  1064  
  1065  	})
  1066  }
  1067  
  1068  func Test_DB_ToIntRecord(t *testing.T) {
  1069  	table := createInitTable()
  1070  	defer dropTable(table)
  1071  	_, err := db.Update(table, "create_time='2010-10-10 00:00:01'", "id=?", 1)
  1072  	gtest.AssertNil(err)
  1073  
  1074  	gtest.C(t, func(t *gtest.T) {
  1075  		id := 1
  1076  		result, err := db.Model(table).Fields("*").Where("id = ?", id).Select()
  1077  		if err != nil {
  1078  			gtest.Fatal(err)
  1079  		}
  1080  
  1081  		type t_user struct {
  1082  			Id         int
  1083  			Passport   string
  1084  			Password   string
  1085  			NickName   string
  1086  			CreateTime string
  1087  		}
  1088  
  1089  		t_users := make([]t_user, 0)
  1090  		err = result.Structs(&t_users)
  1091  		if err != nil {
  1092  			gtest.Fatal(err)
  1093  		}
  1094  
  1095  		resultIntRecord := result.RecordKeyInt("id")
  1096  		t.Assert(t_users[0].Id, resultIntRecord[id]["id"].Int())
  1097  		t.Assert(t_users[0].Passport, resultIntRecord[id]["passport"].String())
  1098  		t.Assert(t_users[0].Password, resultIntRecord[id]["password"].String())
  1099  		t.Assert(t_users[0].NickName, resultIntRecord[id]["nickname"].String())
  1100  		t.Assert(t_users[0].CreateTime, resultIntRecord[id]["create_time"].String())
  1101  
  1102  	})
  1103  }
  1104  
  1105  func Test_DB_ToUintRecord(t *testing.T) {
  1106  	table := createInitTable()
  1107  	defer dropTable(table)
  1108  	_, err := db.Update(table, "create_time='2010-10-10 00:00:01'", "id=?", 1)
  1109  	gtest.AssertNil(err)
  1110  
  1111  	gtest.C(t, func(t *gtest.T) {
  1112  		id := 1
  1113  		result, err := db.Model(table).Fields("*").Where("id = ?", id).Select()
  1114  		if err != nil {
  1115  			gtest.Fatal(err)
  1116  		}
  1117  
  1118  		type t_user struct {
  1119  			Id         int
  1120  			Passport   string
  1121  			Password   string
  1122  			NickName   string
  1123  			CreateTime string
  1124  		}
  1125  
  1126  		t_users := make([]t_user, 0)
  1127  		err = result.Structs(&t_users)
  1128  		if err != nil {
  1129  			gtest.Fatal(err)
  1130  		}
  1131  
  1132  		resultUintRecord := result.RecordKeyUint("id")
  1133  		t.Assert(t_users[0].Id, resultUintRecord[uint(id)]["id"].Int())
  1134  		t.Assert(t_users[0].Passport, resultUintRecord[uint(id)]["passport"].String())
  1135  		t.Assert(t_users[0].Password, resultUintRecord[uint(id)]["password"].String())
  1136  		t.Assert(t_users[0].NickName, resultUintRecord[uint(id)]["nickname"].String())
  1137  		t.Assert(t_users[0].CreateTime, resultUintRecord[uint(id)]["create_time"].String())
  1138  	})
  1139  }
  1140  
  1141  func Test_DB_TableField(t *testing.T) {
  1142  	name := "field_test"
  1143  	dropTable(name)
  1144  	defer dropTable(name)
  1145  	_, err := db.Exec(fmt.Sprintf(`
  1146  		CREATE TABLE %s (
  1147  		field_tinyint  tinyint(8) NULL ,
  1148  		field_int  int(8) NULL ,
  1149  		field_integer  integer(8) NULL ,
  1150  		field_bigint  bigint(8) NULL ,
  1151  		field_bit  bit(3) NULL ,
  1152  		field_real  real(8,0) NULL ,
  1153  		field_double  double(12,2) NULL ,
  1154  		field_varchar  varchar(10) NULL ,
  1155  		field_varbinary  varbinary(255) NULL 
  1156  	) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  1157  	`, name))
  1158  	if err != nil {
  1159  		gtest.Fatal(err)
  1160  	}
  1161  
  1162  	data := gdb.Map{
  1163  		"field_tinyint":   1,
  1164  		"field_int":       2,
  1165  		"field_integer":   3,
  1166  		"field_bigint":    4,
  1167  		"field_bit":       6,
  1168  		"field_real":      123,
  1169  		"field_double":    123.25,
  1170  		"field_varchar":   "abc",
  1171  		"field_varbinary": "aaa",
  1172  	}
  1173  	res, err := db.Model(name).Data(data).Insert()
  1174  	if err != nil {
  1175  		gtest.Fatal(err)
  1176  	}
  1177  
  1178  	n, err := res.RowsAffected()
  1179  	if err != nil {
  1180  		gtest.Fatal(err)
  1181  	} else {
  1182  		gtest.Assert(n, 1)
  1183  	}
  1184  
  1185  	result, err := db.Model(name).Fields("*").Where("field_int = ?", 2).Select()
  1186  	if err != nil {
  1187  		gtest.Fatal(err)
  1188  	}
  1189  
  1190  	gtest.Assert(result[0], data)
  1191  }
  1192  
  1193  func Test_DB_Prefix(t *testing.T) {
  1194  	db := dbPrefix
  1195  	name := fmt.Sprintf(`%s_%d`, TableName, gtime.TimestampNano())
  1196  	table := TableNamePrefix1 + name
  1197  	createTableWithDb(db, table)
  1198  	defer dropTable(table)
  1199  
  1200  	gtest.C(t, func(t *gtest.T) {
  1201  		id := 10000
  1202  		result, err := db.Insert(name, g.Map{
  1203  			"id":          id,
  1204  			"passport":    fmt.Sprintf(`user_%d`, id),
  1205  			"password":    fmt.Sprintf(`pass_%d`, id),
  1206  			"nickname":    fmt.Sprintf(`name_%d`, id),
  1207  			"create_time": gtime.NewFromStr("2018-10-24 10:00:00").String(),
  1208  		})
  1209  		t.AssertNil(err)
  1210  
  1211  		n, e := result.RowsAffected()
  1212  		t.Assert(e, nil)
  1213  		t.Assert(n, 1)
  1214  	})
  1215  
  1216  	gtest.C(t, func(t *gtest.T) {
  1217  		id := 10000
  1218  		result, err := db.Replace(name, g.Map{
  1219  			"id":          id,
  1220  			"passport":    fmt.Sprintf(`user_%d`, id),
  1221  			"password":    fmt.Sprintf(`pass_%d`, id),
  1222  			"nickname":    fmt.Sprintf(`name_%d`, id),
  1223  			"create_time": gtime.NewFromStr("2018-10-24 10:00:01").String(),
  1224  		})
  1225  		t.AssertNil(err)
  1226  
  1227  		n, e := result.RowsAffected()
  1228  		t.Assert(e, nil)
  1229  		t.Assert(n, 2)
  1230  	})
  1231  
  1232  	gtest.C(t, func(t *gtest.T) {
  1233  		id := 10000
  1234  		result, err := db.Save(name, g.Map{
  1235  			"id":          id,
  1236  			"passport":    fmt.Sprintf(`user_%d`, id),
  1237  			"password":    fmt.Sprintf(`pass_%d`, id),
  1238  			"nickname":    fmt.Sprintf(`name_%d`, id),
  1239  			"create_time": gtime.NewFromStr("2018-10-24 10:00:02").String(),
  1240  		})
  1241  		t.AssertNil(err)
  1242  
  1243  		n, e := result.RowsAffected()
  1244  		t.Assert(e, nil)
  1245  		t.Assert(n, 2)
  1246  	})
  1247  
  1248  	gtest.C(t, func(t *gtest.T) {
  1249  		id := 10000
  1250  		result, err := db.Update(name, g.Map{
  1251  			"id":          id,
  1252  			"passport":    fmt.Sprintf(`user_%d`, id),
  1253  			"password":    fmt.Sprintf(`pass_%d`, id),
  1254  			"nickname":    fmt.Sprintf(`name_%d`, id),
  1255  			"create_time": gtime.NewFromStr("2018-10-24 10:00:03").String(),
  1256  		}, "id=?", id)
  1257  		t.AssertNil(err)
  1258  
  1259  		n, e := result.RowsAffected()
  1260  		t.Assert(e, nil)
  1261  		t.Assert(n, 1)
  1262  	})
  1263  
  1264  	gtest.C(t, func(t *gtest.T) {
  1265  		id := 10000
  1266  		result, err := db.Delete(name, "id=?", id)
  1267  		t.AssertNil(err)
  1268  
  1269  		n, e := result.RowsAffected()
  1270  		t.Assert(e, nil)
  1271  		t.Assert(n, 1)
  1272  	})
  1273  
  1274  	gtest.C(t, func(t *gtest.T) {
  1275  		array := garray.New(true)
  1276  		for i := 1; i <= TableSize; i++ {
  1277  			array.Append(g.Map{
  1278  				"id":          i,
  1279  				"passport":    fmt.Sprintf(`user_%d`, i),
  1280  				"password":    fmt.Sprintf(`pass_%d`, i),
  1281  				"nickname":    fmt.Sprintf(`name_%d`, i),
  1282  				"create_time": gtime.NewFromStr("2018-10-24 10:00:00").String(),
  1283  			})
  1284  		}
  1285  
  1286  		result, err := db.Insert(name, array.Slice())
  1287  		t.AssertNil(err)
  1288  
  1289  		n, e := result.RowsAffected()
  1290  		t.Assert(e, nil)
  1291  		t.Assert(n, TableSize)
  1292  	})
  1293  
  1294  }
  1295  
  1296  func Test_Model_InnerJoin(t *testing.T) {
  1297  	gtest.C(t, func(t *gtest.T) {
  1298  		table1 := createInitTable("user1")
  1299  		table2 := createInitTable("user2")
  1300  
  1301  		defer dropTable(table1)
  1302  		defer dropTable(table2)
  1303  
  1304  		res, err := db.Model(table1).Where("id > ?", 5).Delete()
  1305  		if err != nil {
  1306  			t.Fatal(err)
  1307  		}
  1308  
  1309  		n, err := res.RowsAffected()
  1310  		if err != nil {
  1311  			t.Fatal(err)
  1312  		}
  1313  
  1314  		t.Assert(n, 5)
  1315  
  1316  		result, err := db.Model(table1+" u1").InnerJoin(table2+" u2", "u1.id = u2.id").OrderBy("u1.id").Select()
  1317  		if err != nil {
  1318  			t.Fatal(err)
  1319  		}
  1320  
  1321  		t.Assert(len(result), 5)
  1322  
  1323  		result, err = db.Model(table1+" u1").InnerJoin(table2+" u2", "u1.id = u2.id").Where("u1.id > ?", 1).OrderBy("u1.id").Select()
  1324  		if err != nil {
  1325  			t.Fatal(err)
  1326  		}
  1327  
  1328  		t.Assert(len(result), 4)
  1329  	})
  1330  }
  1331  
  1332  func Test_Model_LeftJoin(t *testing.T) {
  1333  	gtest.C(t, func(t *gtest.T) {
  1334  		table1 := createInitTable("user1")
  1335  		table2 := createInitTable("user2")
  1336  
  1337  		defer dropTable(table1)
  1338  		defer dropTable(table2)
  1339  
  1340  		res, err := db.Model(table2).Where("id > ?", 3).Delete()
  1341  		if err != nil {
  1342  			t.Fatal(err)
  1343  		}
  1344  
  1345  		n, err := res.RowsAffected()
  1346  		if err != nil {
  1347  			t.Fatal(err)
  1348  		} else {
  1349  			t.Assert(n, 7)
  1350  		}
  1351  
  1352  		result, err := db.Model(table1+" u1").LeftJoin(table2+" u2", "u1.id = u2.id").Select()
  1353  		if err != nil {
  1354  			t.Fatal(err)
  1355  		}
  1356  
  1357  		t.Assert(len(result), 10)
  1358  
  1359  		result, err = db.Model(table1+" u1").LeftJoin(table2+" u2", "u1.id = u2.id").Where("u1.id > ? ", 2).Select()
  1360  		if err != nil {
  1361  			t.Fatal(err)
  1362  		}
  1363  
  1364  		t.Assert(len(result), 8)
  1365  	})
  1366  }
  1367  
  1368  func Test_Model_RightJoin(t *testing.T) {
  1369  	gtest.C(t, func(t *gtest.T) {
  1370  		table1 := createInitTable("user1")
  1371  		table2 := createInitTable("user2")
  1372  
  1373  		defer dropTable(table1)
  1374  		defer dropTable(table2)
  1375  
  1376  		res, err := db.Model(table1).Where("id > ?", 3).Delete()
  1377  		if err != nil {
  1378  			t.Fatal(err)
  1379  		}
  1380  
  1381  		n, err := res.RowsAffected()
  1382  		if err != nil {
  1383  			t.Fatal(err)
  1384  		}
  1385  
  1386  		t.Assert(n, 7)
  1387  
  1388  		result, err := db.Model(table1+" u1").RightJoin(table2+" u2", "u1.id = u2.id").Select()
  1389  		if err != nil {
  1390  			t.Fatal(err)
  1391  		}
  1392  		t.Assert(len(result), 10)
  1393  
  1394  		result, err = db.Model(table1+" u1").RightJoin(table2+" u2", "u1.id = u2.id").Where("u1.id > 2").Select()
  1395  		if err != nil {
  1396  			t.Fatal(err)
  1397  		}
  1398  		t.Assert(len(result), 1)
  1399  	})
  1400  }
  1401  
  1402  func Test_Empty_Slice_Argument(t *testing.T) {
  1403  	table := createInitTable()
  1404  	defer dropTable(table)
  1405  	gtest.C(t, func(t *gtest.T) {
  1406  		result, err := db.GetAll(fmt.Sprintf(`select * from %s where id in(?)`, table), g.Slice{})
  1407  		t.AssertNil(err)
  1408  		t.Assert(len(result), 0)
  1409  	})
  1410  }
  1411  
  1412  // update counter test
  1413  func Test_DB_UpdateCounter(t *testing.T) {
  1414  	tableName := "gf_update_counter_test_" + gtime.TimestampNanoStr()
  1415  	_, err := db.Exec(fmt.Sprintf(`
  1416  		CREATE TABLE IF NOT EXISTS %s (
  1417  		id int(10) unsigned NOT NULL,
  1418  		views  int(8) unsigned DEFAULT '0'  NOT NULL ,
  1419  		updated_time int(10) unsigned DEFAULT '0' NOT NULL
  1420  	) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  1421  	`, tableName))
  1422  	if err != nil {
  1423  		gtest.Fatal(err)
  1424  	}
  1425  	defer dropTable(tableName)
  1426  
  1427  	gtest.C(t, func(t *gtest.T) {
  1428  		insertData := g.Map{
  1429  			"id":           1,
  1430  			"views":        0,
  1431  			"updated_time": 0,
  1432  		}
  1433  		_, err = db.Insert(tableName, insertData)
  1434  		t.AssertNil(err)
  1435  	})
  1436  
  1437  	gtest.C(t, func(t *gtest.T) {
  1438  		gdbCounter := &gdb.Counter{
  1439  			Field: "id",
  1440  			Value: 1,
  1441  		}
  1442  		updateData := g.Map{
  1443  			"views": gdbCounter,
  1444  		}
  1445  		result, err := db.Update(tableName, updateData, "id", 1)
  1446  		t.AssertNil(err)
  1447  		n, _ := result.RowsAffected()
  1448  		t.Assert(n, 1)
  1449  		one, err := db.Model(tableName).Where("id", 1).One()
  1450  		t.AssertNil(err)
  1451  		t.Assert(one["id"].Int(), 1)
  1452  		t.Assert(one["views"].Int(), 2)
  1453  	})
  1454  
  1455  	gtest.C(t, func(t *gtest.T) {
  1456  		gdbCounter := &gdb.Counter{
  1457  			Field: "views",
  1458  			Value: -1,
  1459  		}
  1460  		updateData := g.Map{
  1461  			"views":        gdbCounter,
  1462  			"updated_time": gtime.Now().Unix(),
  1463  		}
  1464  		result, err := db.Update(tableName, updateData, "id", 1)
  1465  		t.AssertNil(err)
  1466  		n, _ := result.RowsAffected()
  1467  		t.Assert(n, 1)
  1468  		one, err := db.Model(tableName).Where("id", 1).One()
  1469  		t.AssertNil(err)
  1470  		t.Assert(one["id"].Int(), 1)
  1471  		t.Assert(one["views"].Int(), 1)
  1472  	})
  1473  }
  1474  
  1475  func Test_DB_Ctx(t *testing.T) {
  1476  	gtest.C(t, func(t *gtest.T) {
  1477  		ctx, cancel := context.WithTimeout(context.Background(), time.Second)
  1478  		defer cancel()
  1479  		_, err := db.Ctx(ctx).Query("SELECT SLEEP(10)")
  1480  		t.Assert(gstr.Contains(err.Error(), "deadline"), true)
  1481  	})
  1482  }
  1483  
  1484  func Test_DB_Ctx_Logger(t *testing.T) {
  1485  	gtest.C(t, func(t *gtest.T) {
  1486  		defer db.SetDebug(db.GetDebug())
  1487  		db.SetDebug(true)
  1488  		ctx := context.WithValue(context.Background(), "Trace-Id", "123456789")
  1489  		_, err := db.Ctx(ctx).Query("SELECT 1")
  1490  		t.AssertNil(err)
  1491  	})
  1492  }