github.com/zhongdalu/gf@v1.0.0/g/database/gdb/gdb_unit_z_transaction_test.go (about)

     1  // Copyright 2019 gf Author(https://github.com/zhongdalu/gf). 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/zhongdalu/gf.
     6  
     7  package gdb_test
     8  
     9  import (
    10  	"fmt"
    11  	"testing"
    12  
    13  	"github.com/zhongdalu/gf/g"
    14  	"github.com/zhongdalu/gf/g/os/gtime"
    15  	"github.com/zhongdalu/gf/g/test/gtest"
    16  )
    17  
    18  func Test_TX_Query(t *testing.T) {
    19  	tx, err := db.Begin()
    20  	if err != nil {
    21  		gtest.Error(err)
    22  	}
    23  	if rows, err := tx.Query("SELECT ?", 1); err != nil {
    24  		gtest.Error(err)
    25  	} else {
    26  		rows.Close()
    27  	}
    28  	if rows, err := tx.Query("SELECT ?+?", 1, 2); err != nil {
    29  		gtest.Error(err)
    30  	} else {
    31  		rows.Close()
    32  	}
    33  	if rows, err := tx.Query("SELECT ?+?", g.Slice{1, 2}); err != nil {
    34  		gtest.Error(err)
    35  	} else {
    36  		rows.Close()
    37  	}
    38  	if _, err := tx.Query("ERROR"); err == nil {
    39  		gtest.Error("FAIL")
    40  	}
    41  	if err := tx.Commit(); err != nil {
    42  		gtest.Error(err)
    43  	}
    44  }
    45  
    46  func Test_TX_Exec(t *testing.T) {
    47  	tx, err := db.Begin()
    48  	if err != nil {
    49  		gtest.Error(err)
    50  	}
    51  	if _, err := tx.Exec("SELECT ?", 1); err != nil {
    52  		gtest.Error(err)
    53  	}
    54  	if _, err := tx.Exec("SELECT ?+?", 1, 2); err != nil {
    55  		gtest.Error(err)
    56  	}
    57  	if _, err := tx.Exec("SELECT ?+?", g.Slice{1, 2}); err != nil {
    58  		gtest.Error(err)
    59  	}
    60  	if _, err := tx.Exec("ERROR"); err == nil {
    61  		gtest.Error("FAIL")
    62  	}
    63  	if err := tx.Commit(); err != nil {
    64  		gtest.Error(err)
    65  	}
    66  }
    67  
    68  func Test_TX_Commit(t *testing.T) {
    69  	tx, err := db.Begin()
    70  	if err != nil {
    71  		gtest.Error(err)
    72  	}
    73  	if err := tx.Commit(); err != nil {
    74  		gtest.Error(err)
    75  	}
    76  }
    77  
    78  func Test_TX_Rollback(t *testing.T) {
    79  	tx, err := db.Begin()
    80  	if err != nil {
    81  		gtest.Error(err)
    82  	}
    83  	if err := tx.Rollback(); err != nil {
    84  		gtest.Error(err)
    85  	}
    86  }
    87  
    88  func Test_TX_Prepare(t *testing.T) {
    89  	tx, err := db.Begin()
    90  	if err != nil {
    91  		gtest.Error(err)
    92  	}
    93  	st, err := tx.Prepare("SELECT 100")
    94  	if err != nil {
    95  		gtest.Error(err)
    96  	}
    97  	rows, err := st.Query()
    98  	if err != nil {
    99  		gtest.Error(err)
   100  	}
   101  	array, err := rows.Columns()
   102  	if err != nil {
   103  		gtest.Error(err)
   104  	}
   105  	gtest.Assert(array[0], "100")
   106  	if err := rows.Close(); err != nil {
   107  		gtest.Error(err)
   108  	}
   109  	if err := tx.Commit(); err != nil {
   110  		gtest.Error(err)
   111  	}
   112  }
   113  
   114  func Test_TX_Insert(t *testing.T) {
   115  	table := createTable()
   116  	defer dropTable(table)
   117  
   118  	gtest.Case(t, func() {
   119  		tx, err := db.Begin()
   120  		if err != nil {
   121  			gtest.Error(err)
   122  		}
   123  		if _, err := tx.Insert(table, g.Map{
   124  			"id":          1,
   125  			"passport":    "t1",
   126  			"password":    "25d55ad283aa400af464c76d713c07ad",
   127  			"nickname":    "T1",
   128  			"create_time": gtime.Now().String(),
   129  		}); err != nil {
   130  			gtest.Error(err)
   131  		}
   132  		if err := tx.Commit(); err != nil {
   133  			gtest.Error(err)
   134  		}
   135  		if n, err := db.Table(table).Count(); err != nil {
   136  			gtest.Error(err)
   137  		} else {
   138  			gtest.Assert(n, 1)
   139  		}
   140  	})
   141  }
   142  
   143  func Test_TX_BatchInsert(t *testing.T) {
   144  	table := createTable()
   145  	defer dropTable(table)
   146  
   147  	gtest.Case(t, func() {
   148  		tx, err := db.Begin()
   149  		if err != nil {
   150  			gtest.Error(err)
   151  		}
   152  		if _, err := tx.BatchInsert(table, g.List{
   153  			{
   154  				"id":          2,
   155  				"passport":    "t",
   156  				"password":    "25d55ad283aa400af464c76d713c07ad",
   157  				"nickname":    "T2",
   158  				"create_time": gtime.Now().String(),
   159  			},
   160  			{
   161  				"id":          3,
   162  				"passport":    "t3",
   163  				"password":    "25d55ad283aa400af464c76d713c07ad",
   164  				"nickname":    "T3",
   165  				"create_time": gtime.Now().String(),
   166  			},
   167  		}, 10); err != nil {
   168  			gtest.Error(err)
   169  		}
   170  		if err := tx.Commit(); err != nil {
   171  			gtest.Error(err)
   172  		}
   173  		if n, err := db.Table(table).Count(); err != nil {
   174  			gtest.Error(err)
   175  		} else {
   176  			gtest.Assert(n, 2)
   177  		}
   178  	})
   179  }
   180  
   181  func Test_TX_BatchReplace(t *testing.T) {
   182  	table := createInitTable()
   183  	defer dropTable(table)
   184  
   185  	gtest.Case(t, func() {
   186  		tx, err := db.Begin()
   187  		if err != nil {
   188  			gtest.Error(err)
   189  		}
   190  		if _, err := tx.BatchReplace(table, g.List{
   191  			{
   192  				"id":          2,
   193  				"passport":    "USER_2",
   194  				"password":    "PASS_2",
   195  				"nickname":    "NAME_2",
   196  				"create_time": gtime.Now().String(),
   197  			},
   198  			{
   199  				"id":          4,
   200  				"passport":    "USER_4",
   201  				"password":    "PASS_4",
   202  				"nickname":    "NAME_4",
   203  				"create_time": gtime.Now().String(),
   204  			},
   205  		}, 10); err != nil {
   206  			gtest.Error(err)
   207  		}
   208  		if err := tx.Commit(); err != nil {
   209  			gtest.Error(err)
   210  		}
   211  		if n, err := db.Table(table).Count(); err != nil {
   212  			gtest.Error(err)
   213  		} else {
   214  			gtest.Assert(n, INIT_DATA_SIZE)
   215  		}
   216  		if value, err := db.Table(table).Fields("password").Where("id", 2).Value(); err != nil {
   217  			gtest.Error(err)
   218  		} else {
   219  			gtest.Assert(value.String(), "PASS_2")
   220  		}
   221  	})
   222  }
   223  
   224  func Test_TX_BatchSave(t *testing.T) {
   225  	table := createInitTable()
   226  	defer dropTable(table)
   227  
   228  	gtest.Case(t, func() {
   229  		tx, err := db.Begin()
   230  		if err != nil {
   231  			gtest.Error(err)
   232  		}
   233  		if _, err := tx.BatchSave(table, g.List{
   234  			{
   235  				"id":          4,
   236  				"passport":    "USER_4",
   237  				"password":    "PASS_4",
   238  				"nickname":    "NAME_4",
   239  				"create_time": gtime.Now().String(),
   240  			},
   241  		}, 10); err != nil {
   242  			gtest.Error(err)
   243  		}
   244  		if err := tx.Commit(); err != nil {
   245  			gtest.Error(err)
   246  		}
   247  
   248  		if n, err := db.Table(table).Count(); err != nil {
   249  			gtest.Error(err)
   250  		} else {
   251  			gtest.Assert(n, INIT_DATA_SIZE)
   252  		}
   253  
   254  		if value, err := db.Table(table).Fields("password").Where("id", 4).Value(); err != nil {
   255  			gtest.Error(err)
   256  		} else {
   257  			gtest.Assert(value.String(), "PASS_4")
   258  		}
   259  	})
   260  }
   261  
   262  func Test_TX_Replace(t *testing.T) {
   263  	table := createInitTable()
   264  	defer dropTable(table)
   265  
   266  	gtest.Case(t, func() {
   267  		tx, err := db.Begin()
   268  		if err != nil {
   269  			gtest.Error(err)
   270  		}
   271  		if _, err := tx.Replace(table, g.Map{
   272  			"id":          1,
   273  			"passport":    "USER_1",
   274  			"password":    "PASS_1",
   275  			"nickname":    "NAME_1",
   276  			"create_time": gtime.Now().String(),
   277  		}); err != nil {
   278  			gtest.Error(err)
   279  		}
   280  		if err := tx.Rollback(); err != nil {
   281  			gtest.Error(err)
   282  		}
   283  		if value, err := db.Table(table).Fields("nickname").Where("id", 1).Value(); err != nil {
   284  			gtest.Error(err)
   285  		} else {
   286  			gtest.Assert(value.String(), "name_1")
   287  		}
   288  	})
   289  
   290  }
   291  
   292  func Test_TX_Save(t *testing.T) {
   293  	table := createInitTable()
   294  	defer dropTable(table)
   295  
   296  	gtest.Case(t, func() {
   297  		tx, err := db.Begin()
   298  		if err != nil {
   299  			gtest.Error(err)
   300  		}
   301  		if _, err := tx.Save(table, g.Map{
   302  			"id":          1,
   303  			"passport":    "USER_1",
   304  			"password":    "PASS_1",
   305  			"nickname":    "NAME_1",
   306  			"create_time": gtime.Now().String(),
   307  		}); err != nil {
   308  			gtest.Error(err)
   309  		}
   310  		if err := tx.Commit(); err != nil {
   311  			gtest.Error(err)
   312  		}
   313  		if value, err := db.Table(table).Fields("nickname").Where("id", 1).Value(); err != nil {
   314  			gtest.Error(err)
   315  		} else {
   316  			gtest.Assert(value.String(), "NAME_1")
   317  		}
   318  	})
   319  }
   320  
   321  func Test_TX_Update(t *testing.T) {
   322  	table := createInitTable()
   323  	defer dropTable(table)
   324  
   325  	gtest.Case(t, func() {
   326  		tx, err := db.Begin()
   327  		if err != nil {
   328  			gtest.Error(err)
   329  		}
   330  		if result, err := tx.Update(table, "create_time='2019-10-24 10:00:00'", "id=3"); err != nil {
   331  			gtest.Error(err)
   332  		} else {
   333  			n, _ := result.RowsAffected()
   334  			gtest.Assert(n, 1)
   335  		}
   336  		if err := tx.Commit(); err != nil {
   337  			gtest.Error(err)
   338  		}
   339  		_, err = tx.Table(table).Fields("create_time").Where("id", 3).Value()
   340  		gtest.AssertNE(err, nil)
   341  
   342  		if value, err := db.Table(table).Fields("create_time").Where("id", 3).Value(); err != nil {
   343  			gtest.Error(err)
   344  		} else {
   345  			gtest.Assert(value.String(), "2019-10-24 10:00:00")
   346  		}
   347  	})
   348  }
   349  
   350  func Test_TX_GetAll(t *testing.T) {
   351  	table := createInitTable()
   352  	defer dropTable(table)
   353  
   354  	gtest.Case(t, func() {
   355  		tx, err := db.Begin()
   356  		if err != nil {
   357  			gtest.Error(err)
   358  		}
   359  		if result, err := tx.GetAll(fmt.Sprintf("SELECT * FROM %s WHERE id=?", table), 1); err != nil {
   360  			gtest.Error(err)
   361  		} else {
   362  			gtest.Assert(len(result), 1)
   363  		}
   364  		if err := tx.Commit(); err != nil {
   365  			gtest.Error(err)
   366  		}
   367  	})
   368  }
   369  
   370  func Test_TX_GetOne(t *testing.T) {
   371  	table := createInitTable()
   372  	defer dropTable(table)
   373  
   374  	gtest.Case(t, func() {
   375  		tx, err := db.Begin()
   376  		if err != nil {
   377  			gtest.Error(err)
   378  		}
   379  		if record, err := tx.GetOne(fmt.Sprintf("SELECT * FROM %s WHERE passport=?", table), "user_2"); err != nil {
   380  			gtest.Error(err)
   381  		} else {
   382  			if record == nil {
   383  				gtest.Error("FAIL")
   384  			}
   385  			gtest.Assert(record["nickname"].String(), "name_2")
   386  		}
   387  		if err := tx.Commit(); err != nil {
   388  			gtest.Error(err)
   389  		}
   390  	})
   391  }
   392  
   393  func Test_TX_GetValue(t *testing.T) {
   394  	table := createInitTable()
   395  	defer dropTable(table)
   396  
   397  	gtest.Case(t, func() {
   398  		tx, err := db.Begin()
   399  		if err != nil {
   400  			gtest.Error(err)
   401  		}
   402  		if value, err := tx.GetValue(fmt.Sprintf("SELECT id FROM %s WHERE passport=?", table), "user_3"); err != nil {
   403  			gtest.Error(err)
   404  		} else {
   405  			gtest.Assert(value.Int(), 3)
   406  		}
   407  		if err := tx.Commit(); err != nil {
   408  			gtest.Error(err)
   409  		}
   410  	})
   411  
   412  }
   413  
   414  func Test_TX_GetCount(t *testing.T) {
   415  	table := createInitTable()
   416  	defer dropTable(table)
   417  
   418  	gtest.Case(t, func() {
   419  		tx, err := db.Begin()
   420  		if err != nil {
   421  			gtest.Error(err)
   422  		}
   423  		if count, err := tx.GetCount("SELECT * FROM " + table); err != nil {
   424  			gtest.Error(err)
   425  		} else {
   426  			gtest.Assert(count, INIT_DATA_SIZE)
   427  		}
   428  		if err := tx.Commit(); err != nil {
   429  			gtest.Error(err)
   430  		}
   431  	})
   432  }
   433  
   434  func Test_TX_GetStruct(t *testing.T) {
   435  	table := createInitTable()
   436  	defer dropTable(table)
   437  
   438  	gtest.Case(t, func() {
   439  		tx, err := db.Begin()
   440  		if err != nil {
   441  			gtest.Error(err)
   442  		}
   443  		type User struct {
   444  			Id         int
   445  			Passport   string
   446  			Password   string
   447  			NickName   string
   448  			CreateTime gtime.Time
   449  		}
   450  		user := new(User)
   451  		if err := tx.GetStruct(user, fmt.Sprintf("SELECT * FROM %s WHERE id=?", table), 3); err != nil {
   452  			gtest.Error(err)
   453  		}
   454  		gtest.Assert(user.NickName, "name_3")
   455  		gtest.Assert(user.CreateTime.String(), "2018-10-24 10:00:00")
   456  		if err := tx.Commit(); err != nil {
   457  			gtest.Error(err)
   458  		}
   459  	})
   460  	gtest.Case(t, func() {
   461  		tx, err := db.Begin()
   462  		if err != nil {
   463  			gtest.Error(err)
   464  		}
   465  		type User struct {
   466  			Id         int
   467  			Passport   string
   468  			Password   string
   469  			NickName   string
   470  			CreateTime *gtime.Time
   471  		}
   472  		user := new(User)
   473  		if err := tx.GetStruct(user, fmt.Sprintf("SELECT * FROM %s WHERE id=?", table), 3); err != nil {
   474  			gtest.Error(err)
   475  		}
   476  		gtest.Assert(user.NickName, "name_3")
   477  		gtest.Assert(user.CreateTime.String(), "2018-10-24 10:00:00")
   478  		if err := tx.Commit(); err != nil {
   479  			gtest.Error(err)
   480  		}
   481  	})
   482  }
   483  
   484  func Test_TX_GetStructs(t *testing.T) {
   485  	table := createInitTable()
   486  	defer dropTable(table)
   487  
   488  	gtest.Case(t, func() {
   489  		tx, err := db.Begin()
   490  		if err != nil {
   491  			gtest.Error(err)
   492  		}
   493  		type User struct {
   494  			Id         int
   495  			Passport   string
   496  			Password   string
   497  			NickName   string
   498  			CreateTime gtime.Time
   499  		}
   500  		var users []User
   501  		if err := tx.GetStructs(&users, fmt.Sprintf("SELECT * FROM %s WHERE id>=?", table), 1); err != nil {
   502  			gtest.Error(err)
   503  		}
   504  		gtest.Assert(len(users), INIT_DATA_SIZE)
   505  		gtest.Assert(users[0].Id, 1)
   506  		gtest.Assert(users[1].Id, 2)
   507  		gtest.Assert(users[2].Id, 3)
   508  		gtest.Assert(users[0].NickName, "name_1")
   509  		gtest.Assert(users[1].NickName, "name_2")
   510  		gtest.Assert(users[2].NickName, "name_3")
   511  		gtest.Assert(users[2].CreateTime.String(), "2018-10-24 10:00:00")
   512  		if err := tx.Commit(); err != nil {
   513  			gtest.Error(err)
   514  		}
   515  	})
   516  
   517  	gtest.Case(t, func() {
   518  		tx, err := db.Begin()
   519  		if err != nil {
   520  			gtest.Error(err)
   521  		}
   522  		type User struct {
   523  			Id         int
   524  			Passport   string
   525  			Password   string
   526  			NickName   string
   527  			CreateTime *gtime.Time
   528  		}
   529  		var users []User
   530  		if err := tx.GetStructs(&users, fmt.Sprintf("SELECT * FROM %s WHERE id>=?", table), 1); err != nil {
   531  			gtest.Error(err)
   532  		}
   533  		gtest.Assert(len(users), INIT_DATA_SIZE)
   534  		gtest.Assert(users[0].Id, 1)
   535  		gtest.Assert(users[1].Id, 2)
   536  		gtest.Assert(users[2].Id, 3)
   537  		gtest.Assert(users[0].NickName, "name_1")
   538  		gtest.Assert(users[1].NickName, "name_2")
   539  		gtest.Assert(users[2].NickName, "name_3")
   540  		gtest.Assert(users[2].CreateTime.String(), "2018-10-24 10:00:00")
   541  		if err := tx.Commit(); err != nil {
   542  			gtest.Error(err)
   543  		}
   544  	})
   545  }
   546  
   547  func Test_TX_GetScan(t *testing.T) {
   548  	table := createInitTable()
   549  	defer dropTable(table)
   550  
   551  	gtest.Case(t, func() {
   552  		tx, err := db.Begin()
   553  		if err != nil {
   554  			gtest.Error(err)
   555  		}
   556  		type User struct {
   557  			Id         int
   558  			Passport   string
   559  			Password   string
   560  			NickName   string
   561  			CreateTime gtime.Time
   562  		}
   563  		user := new(User)
   564  		if err := tx.GetScan(user, fmt.Sprintf("SELECT * FROM %s WHERE id=?", table), 3); err != nil {
   565  			gtest.Error(err)
   566  		}
   567  		gtest.Assert(user.NickName, "name_3")
   568  		gtest.Assert(user.CreateTime.String(), "2018-10-24 10:00:00")
   569  		if err := tx.Commit(); err != nil {
   570  			gtest.Error(err)
   571  		}
   572  	})
   573  	gtest.Case(t, func() {
   574  		tx, err := db.Begin()
   575  		if err != nil {
   576  			gtest.Error(err)
   577  		}
   578  		type User struct {
   579  			Id         int
   580  			Passport   string
   581  			Password   string
   582  			NickName   string
   583  			CreateTime *gtime.Time
   584  		}
   585  		user := new(User)
   586  		if err := tx.GetScan(user, fmt.Sprintf("SELECT * FROM %s WHERE id=?", table), 3); err != nil {
   587  			gtest.Error(err)
   588  		}
   589  		gtest.Assert(user.NickName, "name_3")
   590  		gtest.Assert(user.CreateTime.String(), "2018-10-24 10:00:00")
   591  		if err := tx.Commit(); err != nil {
   592  			gtest.Error(err)
   593  		}
   594  	})
   595  
   596  	gtest.Case(t, func() {
   597  		tx, err := db.Begin()
   598  		if err != nil {
   599  			gtest.Error(err)
   600  		}
   601  		type User struct {
   602  			Id         int
   603  			Passport   string
   604  			Password   string
   605  			NickName   string
   606  			CreateTime gtime.Time
   607  		}
   608  		var users []User
   609  		if err := tx.GetScan(&users, fmt.Sprintf("SELECT * FROM %s WHERE id>=?", table), 1); err != nil {
   610  			gtest.Error(err)
   611  		}
   612  		gtest.Assert(len(users), INIT_DATA_SIZE)
   613  		gtest.Assert(users[0].Id, 1)
   614  		gtest.Assert(users[1].Id, 2)
   615  		gtest.Assert(users[2].Id, 3)
   616  		gtest.Assert(users[0].NickName, "name_1")
   617  		gtest.Assert(users[1].NickName, "name_2")
   618  		gtest.Assert(users[2].NickName, "name_3")
   619  		gtest.Assert(users[2].CreateTime.String(), "2018-10-24 10:00:00")
   620  		if err := tx.Commit(); err != nil {
   621  			gtest.Error(err)
   622  		}
   623  	})
   624  
   625  	gtest.Case(t, func() {
   626  		tx, err := db.Begin()
   627  		if err != nil {
   628  			gtest.Error(err)
   629  		}
   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  		if err := tx.GetScan(&users, fmt.Sprintf("SELECT * FROM %s WHERE id>=?", table), 1); err != nil {
   639  			gtest.Error(err)
   640  		}
   641  		gtest.Assert(len(users), INIT_DATA_SIZE)
   642  		gtest.Assert(users[0].Id, 1)
   643  		gtest.Assert(users[1].Id, 2)
   644  		gtest.Assert(users[2].Id, 3)
   645  		gtest.Assert(users[0].NickName, "name_1")
   646  		gtest.Assert(users[1].NickName, "name_2")
   647  		gtest.Assert(users[2].NickName, "name_3")
   648  		gtest.Assert(users[2].CreateTime.String(), "2018-10-24 10:00:00")
   649  		if err := tx.Commit(); err != nil {
   650  			gtest.Error(err)
   651  		}
   652  	})
   653  }
   654  
   655  func Test_TX_Delete(t *testing.T) {
   656  	table := createInitTable()
   657  	defer dropTable(table)
   658  
   659  	gtest.Case(t, func() {
   660  		tx, err := db.Begin()
   661  		if err != nil {
   662  			gtest.Error(err)
   663  		}
   664  		if _, err := tx.Delete(table, nil); err != nil {
   665  			gtest.Error(err)
   666  		}
   667  		if err := tx.Commit(); err != nil {
   668  			gtest.Error(err)
   669  		}
   670  		if n, err := db.Table(table).Count(); err != nil {
   671  			gtest.Error(err)
   672  		} else {
   673  			gtest.Assert(n, 0)
   674  		}
   675  	})
   676  
   677  }