@@ -11,15 +11,15 @@ import (
1111
1212// User model demonstrating basic GORM features
1313type User struct {
14- ID uint `gorm:"primaryKey" json:"id"` // Remove autoIncrement
15- Name string `gorm:"size:100;not null" json:"name"`
16- Email string `gorm:"size:255;uniqueIndex" json:"email"`
17- Age uint8 `json:"age"`
18- Birthday time.Time `json:"birthday"` // Change from *time.Time to time.Time
19- CreatedAt time.Time `gorm:"autoCreateTime:false" json:"created_at"`
20- UpdatedAt time.Time `gorm:"autoUpdateTime:false" json:"updated_at"`
21- Posts []Post `gorm:"foreignKey:UserID" json:"posts"`
22- Tags [] string `gorm:"type:text[]" json:"tags"`
14+ ID uint `gorm:"primaryKey" json:"id"`
15+ Name string `gorm:"size:100;not null" json:"name"`
16+ Email string `gorm:"size:255;uniqueIndex" json:"email"`
17+ Age uint8 `json:"age"`
18+ Birthday time.Time `json:"birthday"`
19+ CreatedAt time.Time `gorm:"autoCreateTime:false" json:"created_at"`
20+ UpdatedAt time.Time `gorm:"autoUpdateTime:false" json:"updated_at"`
21+ Posts []Post `gorm:"foreignKey:UserID" json:"posts"`
22+ Tags duckdb. StringArray ` json:"tags"` // Now using proper array type!
2323}
2424
2525// Post model demonstrating relationships
@@ -43,17 +43,20 @@ type Tag struct {
4343
4444// Product model demonstrating basic features
4545type Product struct {
46- ID uint `gorm:"primaryKey" json:"id"` // Remove autoIncrement
47- Name string `gorm:"size:100;not null" json:"name"`
48- Price float64 `json:"price"`
49- Description string `json:"description"`
50- CreatedAt time.Time `json:"created_at"`
51- UpdatedAt time.Time `json:"updated_at"`
46+ ID uint `gorm:"primaryKey" json:"id"` // Remove autoIncrement
47+ Name string `gorm:"size:100;not null" json:"name"`
48+ Price float64 `json:"price"`
49+ Description string `json:"description"`
50+ Categories duckdb.StringArray `json:"categories"` // Array support
51+ Scores duckdb.FloatArray `json:"scores"` // Float array support
52+ ViewCounts duckdb.IntArray `json:"view_counts"` // Int array support
53+ CreatedAt time.Time `json:"created_at"`
54+ UpdatedAt time.Time `json:"updated_at"`
5255}
5356
5457func main () {
55- fmt .Println ("π¦ GORM DuckDB Driver Example" )
56- fmt .Println ("=============================" )
58+ fmt .Println ("π¦ GORM DuckDB Driver Example with Array Support " )
59+ fmt .Println ("================================================= " )
5760
5861 // Initialize database
5962 db , err := gorm .Open (duckdb .Open ("example.db" ), & gorm.Config {})
@@ -74,6 +77,9 @@ func main() {
7477 // Demonstrate basic CRUD operations
7578 demonstrateBasicCRUD (db )
7679
80+ // Demonstrate array features
81+ demonstrateArrayFeatures (db )
82+
7783 // Demonstrate relationships
7884 demonstrateRelationships (db )
7985
@@ -112,7 +118,7 @@ func demonstrateBasicCRUD(db *gorm.DB) {
112118 Birthday : birthday ,
113119 CreatedAt : now ,
114120 UpdatedAt : now ,
115- // Tags: []string {"developer", "go-enthusiast"}, // TODO: Array support
121+ Tags : duckdb. StringArray {"developer" , "go-enthusiast" }, // Now working!
116122 },
117123 {
118124 ID : nextUserID + 1 ,
@@ -122,7 +128,7 @@ func demonstrateBasicCRUD(db *gorm.DB) {
122128 Birthday : time.Time {}, // Zero time for no birthday
123129 CreatedAt : now ,
124130 UpdatedAt : now ,
125- // Tags: []string {"manager", "tech-lead"}, // TODO: Array support
131+ Tags : duckdb. StringArray {"manager" , "tech-lead" }, // Now working!
126132 },
127133 {
128134 ID : nextUserID + 2 ,
@@ -132,7 +138,7 @@ func demonstrateBasicCRUD(db *gorm.DB) {
132138 Birthday : time.Time {}, // Zero time for no birthday
133139 CreatedAt : now ,
134140 UpdatedAt : now ,
135- // Tags: []string {"analyst", "data-science"}, // TODO: Array support
141+ Tags : duckdb. StringArray {"analyst" , "data-science" }, // Now working!
136142 },
137143 }
138144
@@ -149,12 +155,20 @@ func demonstrateBasicCRUD(db *gorm.DB) {
149155 db .Find (& allUsers )
150156 fmt .Printf ("π₯ Found %d users in database\n " , len (allUsers ))
151157
152- // TODO: Array querying - implement with proper Valuer support
153- // var developersWithArrays []User
154- // db.Where("tags @> ?", `["developer"]`).Find(&developersWithArrays)
155- // if len(developersWithArrays) > 0 {
156- // fmt.Printf("π·οΈ Found %d users with 'developer' tag: %s\n", len(developersWithArrays), developersWithArrays[0].Name)
157- // }
158+ // Show users with their tags
159+ for _ , user := range allUsers {
160+ if len (user .Tags ) > 0 {
161+ fmt .Printf ("π·οΈ %s has tags: %v\n " , user .Name , []string (user .Tags ))
162+ }
163+ }
164+
165+ // Array querying example (basic substring search)
166+ var developersWithArrays []User
167+ // Note: DuckDB array syntax might vary, this is a basic example
168+ result = db .Where ("array_to_string(tags, ',') LIKE ?" , "%developer%" ).Find (& developersWithArrays )
169+ if result .Error == nil && len (developersWithArrays ) > 0 {
170+ fmt .Printf ("π Found %d users with 'developer' in tags\n " , len (developersWithArrays ))
171+ }
158172
159173 // Update operation
160174 db .Model (& users [0 ]).Update ("age" , 26 )
@@ -165,6 +179,76 @@ func demonstrateBasicCRUD(db *gorm.DB) {
165179 fmt .Printf ("ποΈ Deleted user: %s\n " , users [2 ].Name )
166180}
167181
182+ // Add this new function to demonstrate array features:
183+ func demonstrateArrayFeatures (db * gorm.DB ) {
184+ fmt .Println ("\n π¨ Array Features Demonstration" )
185+ fmt .Println ("-------------------------------" )
186+
187+ // Get the starting ID for products
188+ nextProductID := getNextID (db , "products" )
189+
190+ // Create products with arrays
191+ now := time .Now ()
192+ products := []Product {
193+ {
194+ ID : nextProductID ,
195+ Name : "Analytics Software" ,
196+ Price : 299.99 ,
197+ Description : "Advanced data analytics platform" ,
198+ Categories : duckdb.StringArray {"software" , "analytics" , "business" },
199+ Scores : duckdb.FloatArray {4.5 , 4.8 , 4.2 , 4.9 },
200+ ViewCounts : duckdb.IntArray {1250 , 890 , 2340 , 567 },
201+ CreatedAt : now ,
202+ UpdatedAt : now ,
203+ },
204+ {
205+ ID : nextProductID + 1 ,
206+ Name : "Gaming Laptop" ,
207+ Price : 1299.99 ,
208+ Description : "High-performance gaming laptop" ,
209+ Categories : duckdb.StringArray {"electronics" , "computers" , "gaming" },
210+ Scores : duckdb.FloatArray {4.7 , 4.9 , 4.6 },
211+ ViewCounts : duckdb.IntArray {3200 , 2100 , 4500 },
212+ CreatedAt : now ,
213+ UpdatedAt : now ,
214+ },
215+ }
216+
217+ result := db .Create (& products )
218+ if result .Error != nil {
219+ log .Printf ("Error creating products with arrays: %v" , result .Error )
220+ return
221+ }
222+ fmt .Printf ("β
Created %d products with arrays\n " , result .RowsAffected )
223+
224+ // Retrieve and display arrays
225+ var retrievedProducts []Product
226+ db .Find (& retrievedProducts )
227+
228+ for _ , product := range retrievedProducts {
229+ fmt .Printf ("π¦ Product: %s\n " , product .Name )
230+ fmt .Printf (" Categories: %v\n " , []string (product .Categories ))
231+ fmt .Printf (" Scores: %v\n " , []float64 (product .Scores ))
232+ fmt .Printf (" View Counts: %v\n " , []int64 (product .ViewCounts ))
233+ }
234+
235+ // Update arrays
236+ if len (retrievedProducts ) > 0 {
237+ product := & retrievedProducts [0 ]
238+ product .Categories = append (product .Categories , "premium" )
239+ product .Scores = append (product .Scores , 5.0 )
240+ product .ViewCounts = append (product .ViewCounts , 1000 )
241+
242+ result = db .Save (product )
243+ if result .Error != nil {
244+ log .Printf ("Error updating product arrays: %v" , result .Error )
245+ } else {
246+ fmt .Printf ("β
Updated arrays for product: %s\n " , product .Name )
247+ fmt .Printf (" New categories: %v\n " , []string (product .Categories ))
248+ }
249+ }
250+ }
251+
168252func demonstrateRelationships (db * gorm.DB ) {
169253 fmt .Println ("\n π Relationships and Associations" )
170254 fmt .Println ("----------------------------------" )
0 commit comments