@@ -18,7 +18,234 @@ import (
1818 "github.com/gogf/gf/v2/test/gtest"
1919)
2020
21- func Test_Model_Sharding_Table (t * testing.T ) {
21+ const (
22+ TestDbNameSh0 = "test_0"
23+ TestDbNameSh1 = "test_1"
24+ TestTableName = "user"
25+ )
26+
27+ type ShardingUser struct {
28+ Id int
29+ Name string
30+ }
31+
32+ // createShardingDatabase creates test databases and tables for sharding
33+ func createShardingDatabase (t * gtest.T ) {
34+ // Create databases
35+ dbs := []string {TestDbNameSh0 , TestDbNameSh1 }
36+ for _ , dbName := range dbs {
37+ sql := fmt .Sprintf ("CREATE DATABASE IF NOT EXISTS `%s`" , dbName )
38+ _ , err := db .Exec (ctx , sql )
39+ t .AssertNil (err )
40+
41+ // Switch to the database
42+ sql = fmt .Sprintf ("USE `%s`" , dbName )
43+ _ , err = db .Exec (ctx , sql )
44+ t .AssertNil (err )
45+
46+ // Create tables
47+ tables := []string {"user_0" , "user_1" , "user_2" , "user_3" }
48+ for _ , table := range tables {
49+ sql := fmt .Sprintf (`
50+ CREATE TABLE IF NOT EXISTS %s (
51+ id int(11) NOT NULL,
52+ name varchar(255) NOT NULL,
53+ PRIMARY KEY (id)
54+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
55+ ` , table )
56+ _ , err := db .Exec (ctx , sql )
57+ t .AssertNil (err )
58+ }
59+ }
60+ }
61+
62+ // dropShardingDatabase drops test databases
63+ func dropShardingDatabase (t * gtest.T ) {
64+ dbs := []string {TestDbNameSh0 , TestDbNameSh1 }
65+ for _ , dbName := range dbs {
66+ sql := fmt .Sprintf ("DROP DATABASE IF EXISTS `%s`" , dbName )
67+ _ , err := db .Exec (ctx , sql )
68+ t .AssertNil (err )
69+ }
70+ }
71+
72+ func Test_Sharding_Basic (t * testing.T ) {
73+ return
74+ gtest .C (t , func (t * gtest.T ) {
75+ var (
76+ tablePrefix = "user_"
77+ schemaPrefix = "test_"
78+ )
79+
80+ // Create test databases and tables
81+ createShardingDatabase (t )
82+ defer dropShardingDatabase (t )
83+
84+ // Create sharding configuration
85+ shardingConfig := gdb.ShardingConfig {
86+ Table : gdb.ShardingTableConfig {
87+ Enable : true ,
88+ Prefix : tablePrefix ,
89+ Rule : & gdb.DefaultShardingRule {
90+ TableCount : 4 ,
91+ },
92+ },
93+ Schema : gdb.ShardingSchemaConfig {
94+ Enable : true ,
95+ Prefix : schemaPrefix ,
96+ Rule : & gdb.DefaultShardingRule {
97+ SchemaCount : 2 ,
98+ },
99+ },
100+ }
101+
102+ // Prepare test data
103+ user := ShardingUser {
104+ Id : 1 ,
105+ Name : "John" ,
106+ }
107+
108+ model := db .Model (TestTableName ).
109+ Sharding (shardingConfig ).
110+ ShardingValue (user .Id ).
111+ Safe ()
112+
113+ // Test Insert
114+ _ , err := model .Data (user ).Insert ()
115+ t .AssertNil (err )
116+
117+ // Test Select
118+ var result ShardingUser
119+ err = model .Where ("id" , user .Id ).Scan (& result )
120+ t .AssertNil (err )
121+ t .Assert (result .Id , user .Id )
122+ t .Assert (result .Name , user .Name )
123+
124+ // Test Update
125+ _ , err = model .Data (g.Map {"name" : "John Doe" }).
126+ Where ("id" , user .Id ).
127+ Update ()
128+ t .AssertNil (err )
129+
130+ // Verify Update
131+ err = model .Where ("id" , user .Id ).Scan (& result )
132+ t .AssertNil (err )
133+ t .Assert (result .Name , "John Doe" )
134+
135+ // Test Delete
136+ _ , err = model .Where ("id" , user .Id ).Delete ()
137+ t .AssertNil (err )
138+
139+ // Verify Delete
140+ count , err := model .Where ("id" , user .Id ).Count ()
141+ t .AssertNil (err )
142+ t .Assert (count , 0 )
143+ })
144+ }
145+
146+ // Test_Sharding_Error tests error cases
147+ func Test_Sharding_Error (t * testing.T ) {
148+ return
149+ gtest .C (t , func (t * gtest.T ) {
150+ // Create test databases and tables
151+ createShardingDatabase (t )
152+ defer dropShardingDatabase (t )
153+
154+ // Test missing sharding value
155+ model := db .Model (TestTableName ).
156+ Sharding (gdb.ShardingConfig {
157+ Table : gdb.ShardingTableConfig {
158+ Enable : true ,
159+ Prefix : "user_" ,
160+ Rule : & gdb.DefaultShardingRule {TableCount : 4 },
161+ },
162+ }).Safe ()
163+
164+ _ , err := model .Insert (g.Map {"id" : 1 , "name" : "test" })
165+ t .AssertNE (err , nil )
166+ t .Assert (err .Error (), "sharding value is required when sharding feature enabled" )
167+
168+ // Test missing sharding rule
169+ model = db .Model (TestTableName ).
170+ Sharding (gdb.ShardingConfig {
171+ Table : gdb.ShardingTableConfig {
172+ Enable : true ,
173+ Prefix : "user_" ,
174+ },
175+ }).
176+ ShardingValue (1 )
177+
178+ _ , err = model .Insert (g.Map {"id" : 1 , "name" : "test" })
179+ t .AssertNE (err , nil )
180+ t .Assert (err .Error (), "sharding rule is required when sharding feature enabled" )
181+ })
182+ }
183+
184+ // Test_Sharding_Complex tests complex sharding scenarios
185+ func Test_Sharding_Complex (t * testing.T ) {
186+ return
187+ gtest .C (t , func (t * gtest.T ) {
188+ // Create test databases and tables
189+ createShardingDatabase (t )
190+ defer dropShardingDatabase (t )
191+
192+ shardingConfig := gdb.ShardingConfig {
193+ Table : gdb.ShardingTableConfig {
194+ Enable : true ,
195+ Prefix : "user_" ,
196+ Rule : & gdb.DefaultShardingRule {TableCount : 4 },
197+ },
198+ Schema : gdb.ShardingSchemaConfig {
199+ Enable : true ,
200+ Prefix : "test_" ,
201+ Rule : & gdb.DefaultShardingRule {SchemaCount : 2 },
202+ },
203+ }
204+
205+ users := []ShardingUser {
206+ {Id : 1 , Name : "User1" },
207+ {Id : 2 , Name : "User2" },
208+ {Id : 3 , Name : "User3" },
209+ }
210+
211+ for _ , user := range users {
212+ model := db .Model (TestTableName ).
213+ Sharding (shardingConfig ).
214+ ShardingValue (user .Id ).
215+ Safe ()
216+
217+ _ , err := model .Data (user ).Insert ()
218+ t .AssertNil (err )
219+ }
220+
221+ // Test batch query
222+ for _ , user := range users {
223+ model := db .Model (TestTableName ).
224+ Sharding (shardingConfig ).
225+ ShardingValue (user .Id ).
226+ Safe ()
227+
228+ var result ShardingUser
229+ err := model .Where ("id" , user .Id ).Scan (& result )
230+ t .AssertNil (err )
231+ t .Assert (result .Id , user .Id )
232+ t .Assert (result .Name , user .Name )
233+ }
234+
235+ // Clean up
236+ for _ , user := range users {
237+ model := db .Model (TestTableName ).
238+ Sharding (shardingConfig ).
239+ ShardingValue (user .Id ).
240+ Safe ()
241+
242+ _ , err := model .Where ("id" , user .Id ).Delete ()
243+ t .AssertNil (err )
244+ }
245+ })
246+ }
247+
248+ func Test_Model_Sharding_Table_Using_Hook (t * testing.T ) {
22249 var (
23250 table1 = gtime .TimestampNanoStr () + "_table1"
24251 table2 = gtime .TimestampNanoStr () + "_table2"
@@ -127,7 +354,7 @@ func Test_Model_Sharding_Table(t *testing.T) {
127354 })
128355}
129356
130- func Test_Model_Sharding_Schema (t * testing.T ) {
357+ func Test_Model_Sharding_Schema_Using_Hook (t * testing.T ) {
131358 var (
132359 table = gtime .TimestampNanoStr () + "_table"
133360 )
0 commit comments