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 }