github.com/gogf/gf@v1.16.9/database/gdb/gdb_z_init_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/frame/g"
    14  	"github.com/gogf/gf/os/gcmd"
    15  
    16  	"github.com/gogf/gf/database/gdb"
    17  	"github.com/gogf/gf/os/gtime"
    18  	"github.com/gogf/gf/test/gtest"
    19  )
    20  
    21  const (
    22  	TableSize        = 10
    23  	TableName        = "user"
    24  	TestSchema1      = "test1"
    25  	TestSchema2      = "test2"
    26  	TableNamePrefix1 = "gf_"
    27  	TestDbUser       = "root"
    28  	TestDbPass       = "12345678"
    29  	CreateTime       = "2018-10-24 10:00:00"
    30  )
    31  
    32  var (
    33  	db          gdb.DB
    34  	dbPrefix    gdb.DB
    35  	dbCtxStrict gdb.DB
    36  	configNode  gdb.ConfigNode
    37  )
    38  
    39  func init() {
    40  	parser, err := gcmd.Parse(g.MapStrBool{
    41  		"name": true,
    42  		"type": true,
    43  	}, false)
    44  	gtest.AssertNil(err)
    45  	configNode = gdb.ConfigNode{
    46  		Host:             "127.0.0.1",
    47  		Port:             "3306",
    48  		User:             TestDbUser,
    49  		Pass:             TestDbPass,
    50  		Name:             parser.GetOpt("name", ""),
    51  		Type:             parser.GetOpt("type", "mysql"),
    52  		Role:             "master",
    53  		Charset:          "utf8",
    54  		Weight:           1,
    55  		MaxIdleConnCount: 10,
    56  		MaxOpenConnCount: 10,
    57  		MaxConnLifeTime:  600,
    58  	}
    59  	nodePrefix := configNode
    60  	nodePrefix.Prefix = TableNamePrefix1
    61  
    62  	nodeCtxStrict := configNode
    63  	nodeCtxStrict.CtxStrict = true
    64  
    65  	gdb.AddConfigNode("test", configNode)
    66  	gdb.AddConfigNode("prefix", nodePrefix)
    67  	gdb.AddConfigNode("ctxstrict", nodeCtxStrict)
    68  	gdb.AddConfigNode(gdb.DefaultGroupName, configNode)
    69  
    70  	// Default db.
    71  	if r, err := gdb.New(); err != nil {
    72  		gtest.Error(err)
    73  	} else {
    74  		db = r
    75  	}
    76  	schemaTemplate := "CREATE DATABASE IF NOT EXISTS `%s` CHARACTER SET UTF8"
    77  	if _, err := db.Exec(fmt.Sprintf(schemaTemplate, TestSchema1)); err != nil {
    78  		gtest.Error(err)
    79  	}
    80  	if _, err := db.Exec(fmt.Sprintf(schemaTemplate, TestSchema2)); err != nil {
    81  		gtest.Error(err)
    82  	}
    83  	db.SetSchema(TestSchema1)
    84  
    85  	// Prefix db.
    86  	if r, err := gdb.New("prefix"); err != nil {
    87  		gtest.Error(err)
    88  	} else {
    89  		dbPrefix = r
    90  	}
    91  	if _, err := dbPrefix.Exec(fmt.Sprintf(schemaTemplate, TestSchema1)); err != nil {
    92  		gtest.Error(err)
    93  	}
    94  	if _, err := dbPrefix.Exec(fmt.Sprintf(schemaTemplate, TestSchema2)); err != nil {
    95  		gtest.Error(err)
    96  	}
    97  	dbPrefix.SetSchema(TestSchema1)
    98  
    99  	// CtxStrict db.
   100  	if r, err := gdb.New("ctxstrict"); err != nil {
   101  		gtest.Error(err)
   102  	} else {
   103  		dbCtxStrict = r
   104  	}
   105  	if _, err := dbCtxStrict.Ctx(context.TODO()).Exec(fmt.Sprintf(schemaTemplate, TestSchema1)); err != nil {
   106  		gtest.Error(err)
   107  	}
   108  	if _, err := dbCtxStrict.Ctx(context.TODO()).Exec(fmt.Sprintf(schemaTemplate, TestSchema2)); err != nil {
   109  		gtest.Error(err)
   110  	}
   111  	dbCtxStrict.SetSchema(TestSchema1)
   112  }
   113  
   114  func createTable(table ...string) string {
   115  	return createTableWithDb(db, table...)
   116  }
   117  
   118  func createInitTable(table ...string) string {
   119  	return createInitTableWithDb(db, table...)
   120  }
   121  
   122  func dropTable(table string) {
   123  	dropTableWithDb(db, table)
   124  }
   125  
   126  func createTableWithDb(db gdb.DB, table ...string) (name string) {
   127  	if len(table) > 0 {
   128  		name = table[0]
   129  	} else {
   130  		name = fmt.Sprintf(`%s_%d`, TableName, gtime.TimestampNano())
   131  	}
   132  	dropTableWithDb(db, name)
   133  
   134  	switch configNode.Type {
   135  	case "sqlite":
   136  		if _, err := db.Ctx(context.TODO()).Exec(fmt.Sprintf(`
   137  		CREATE TABLE %s (
   138  		   id bigint unsigned NOT NULL AUTO_INCREMENT,
   139  		   passport varchar(45),
   140  		   password char(32) NOT NULL,
   141  		   nickname varchar(45) NOT NULL,
   142  		   create_time timestamp NOT NULL,
   143  		   PRIMARY KEY (id)
   144  		) ;`, name,
   145  		)); err != nil {
   146  			gtest.Fatal(err)
   147  		}
   148  	case "pgsql":
   149  		if _, err := db.Ctx(context.TODO()).Exec(fmt.Sprintf(`
   150  		CREATE TABLE %s (
   151  		   id bigint  NOT NULL,
   152  		   passport varchar(45),
   153  		   password char(32) NOT NULL,
   154  		   nickname varchar(45) NOT NULL,
   155  		   create_time timestamp NOT NULL,
   156  		   PRIMARY KEY (id)
   157  		) ;`, name,
   158  		)); err != nil {
   159  			gtest.Fatal(err)
   160  		}
   161  	case "mssql":
   162  		if _, err := db.Ctx(context.TODO()).Exec(fmt.Sprintf(`
   163  		IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='%s' and xtype='U')
   164  		CREATE TABLE %s (
   165  		ID numeric(10,0) NOT NULL,
   166  		PASSPORT VARCHAR(45) NOT NULL,
   167  		PASSWORD CHAR(32) NOT NULL,
   168  		NICKNAME VARCHAR(45) NOT NULL,
   169  		CREATE_TIME datetime NOT NULL,
   170  		PRIMARY KEY (ID))`,
   171  			name, name,
   172  		)); err != nil {
   173  			gtest.Fatal(err)
   174  		}
   175  	case "oracle":
   176  		if _, err := db.Ctx(context.TODO()).Exec(fmt.Sprintf(`
   177  		CREATE TABLE %s (
   178  		ID NUMBER(10) NOT NULL,
   179  		PASSPORT VARCHAR(45) NOT NULL,
   180  		PASSWORD CHAR(32) NOT NULL,
   181  		NICKNAME VARCHAR(45) NOT NULL,
   182  		CREATE_TIME varchar(45) NOT NULL,
   183  		PRIMARY KEY (ID))
   184  		`, name,
   185  		)); err != nil {
   186  			gtest.Fatal(err)
   187  		}
   188  	case "mysql":
   189  		if _, err := db.Ctx(context.TODO()).Exec(fmt.Sprintf(`
   190  	    CREATE TABLE %s (
   191  	        id          int(10) unsigned NOT NULL AUTO_INCREMENT,
   192  	        passport    varchar(45) NULL,
   193  	        password    char(32) NULL,
   194  	        nickname    varchar(45) NULL,
   195  	        create_time timestamp NULL,
   196  	        PRIMARY KEY (id)
   197  	    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
   198  	    `, name,
   199  		)); err != nil {
   200  			gtest.Fatal(err)
   201  		}
   202  	}
   203  
   204  	return
   205  }
   206  
   207  func createInitTableWithDb(db gdb.DB, table ...string) (name string) {
   208  	name = createTableWithDb(db, table...)
   209  	array := garray.New(true)
   210  	for i := 1; i <= TableSize; i++ {
   211  		array.Append(g.Map{
   212  			"id":          i,
   213  			"passport":    fmt.Sprintf(`user_%d`, i),
   214  			"password":    fmt.Sprintf(`pass_%d`, i),
   215  			"nickname":    fmt.Sprintf(`name_%d`, i),
   216  			"create_time": gtime.NewFromStr(CreateTime).String(),
   217  		})
   218  	}
   219  
   220  	result, err := db.Ctx(context.TODO()).Insert(name, array.Slice())
   221  	gtest.AssertNil(err)
   222  
   223  	n, e := result.RowsAffected()
   224  	gtest.Assert(e, nil)
   225  	gtest.Assert(n, TableSize)
   226  	return
   227  }
   228  
   229  func dropTableWithDb(db gdb.DB, table string) {
   230  	if _, err := db.Ctx(context.TODO()).Exec(fmt.Sprintf("DROP TABLE IF EXISTS `%s`", table)); err != nil {
   231  		gtest.Error(err)
   232  	}
   233  }