Skip to content

Instantly share code, notes, and snippets.

@alingse
Created April 6, 2023 10:16
Show Gist options
  • Save alingse/adbcd450ea6760bac1d41faa07610870 to your computer and use it in GitHub Desktop.
Save alingse/adbcd450ea6760bac1d41faa07610870 to your computer and use it in GitHub Desktop.
query for json type go
package main
import (
"context"
"database/sql"
"fmt"
"gorm.io/datatypes"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type (
User struct {
Name string `json:"name"`
Age int `json:"age"`
}
TestTable struct {
ID uint64
Data datatypes.JSONType[*User]
}
)
func (*TestTable) TableName() string {
return "user"
}
func main() {
var ctx = context.Background()
var db = prepareDB()
var err error
db = db.WithContext(ctx)
db.AutoMigrate(&TestTable{})
db.Create(&TestTable{Data: datatypes.JSONType[*User]{Data: &User{Name: "name", Age: 18}}})
// ok
row := &TestTable{}
db.Limit(1).Order("id DESC").Find(row)
// find all row &{name 18}
fmt.Println("find all row ", row.Data.Data)
// ok
var field datatypes.JSONType[*User]
err = db.Model(&TestTable{}).Limit(1).Order("id DESC").Pluck("data", &field).Error
// find field &{name 18} <nil>
fmt.Println("find field ", field.Data, err)
// ok
var fullRow TestTable
err = db.Model(&TestTable{}).Limit(1).Order("id DESC").Pluck("data", &fullRow.Data).Error
// find field in row <nil> &{name 18}
fmt.Println("find field in row ", err, fullRow.Data.Data)
}
func prepareDB() *gorm.DB {
var err error
pool, err := sql.Open("mysql", "root:@tcp(localhost:3306)/test?charset=utf8mb4&parseTime=true&loc=Local")
if err != nil {
panic(err)
}
db, err := gorm.Open(mysql.New(mysql.Config{Conn: pool}), &gorm.Config{})
if err != nil {
panic(err)
}
return db
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment