在golang xorm中使用postgresql的json,array类型的操作可以通过以下步骤完成:
1. 声明结构体并设置相关参数
type User struct {
Id int64 `xorm:"pk autoincr"`
Name string `xorm:"varchar(25) notnull"`
Age int `xorm:"int notnull"`
Profile Profile `xorm:"jsonb"`
Emails []string `xorm:"text[]"`
}
type Profile struct {
Avatar string `json:"avatar"`
Gender string `json:"gender"`
Extra string `json:"extra,omitempty"`
}
engine, _ := xorm.NewEngine("postgres", "dbname=test user=postgres password=root host=localhost port=5432 sslmode=disable")
engine.SetMapper(core.SameMapper{})
engine.SetTableMapper(core.SnakeMapper{})
其中 Profile
是一个嵌套的结构体,表示用户个人资料,其中使用了json
标记来使得该结构实现一个 jsonb
值,Emails
是一个字符串数组。
2. 创建数据表并插入数据
err := engine.Sync2(new(User))
if err != nil {
log.Fatalf("sync database failed: %v\n", err)
}
user := &User{
Name: "jack",
Age: 23,
Profile: Profile{
Avatar: "http://baidu.com",
Gender: "male",
Extra: "",
},
Emails: []string{"abc@abc.com", "abc@efg.com"},
}
affected, err := engine.Insert(user)
if err != nil {
log.Fatalf("insert error: %v, user: %v\n", err, user)
}
fmt.Printf("inserted %d rows\n", affected)
首先,我们需要执行 Sync2
方法来同步 User 结构体和数据表。然后我们创建了一个 User 示例并进行数据插入操作。
3. 查询数组 Emails
var user User
has, err := engine.Where("age > ?", 0).And("name = ?", "jack").Get(&user)
if err != nil {
log.Fatalf("get error: %v", err)
}
if has {
fmt.Printf("user.Name: %v\n", user.Name)
fmt.Printf("user.Emails: %#v\n", user.Emails)
}
利用 Where
和 Get
方法,我们可以在 xorm 中完成查询语句的建立和查询结果的获取。由于 Emails
在表中的列类型为 text[]
,在用户结构体中使用的类型是 []string
,xorm会为我们自动转换和映射类型,同时查询结果的 user.Emails
属性也是一个 []string
类型。
4. 修改JSON Profile
affected, err = engine.ID(user.Id).Cols("profile").Update(&User{
Profile: Profile{
Avatar: "http://google.com",
Gender: "male",
Extra: "",
},
})
if err != nil {
log.Fatalf("update error: %v", err)
}
fmt.Printf("update %d rows\n", affected)
使用 Cols
方法指定你要更新的列。在这个例子中,我们只更新了 Profile
列,但是由于我们仅提供了我们想要更新的子列,因此 xorm 只会更改这些值并留下剩余的任何值不变。
5. 查询JSON Profile
has, err = engine.Where("name=?", "jack").Get(&user)
if err != nil {
log.Fatalf("get error: %v", err)
}
if has {
fmt.Printf("user.Name: %v\n", user.Name)
fmt.Printf("user.Profile.Avatar: %v\n", user.Profile.Avatar)
}
使用 Where
和 Get
方法可以查询 User
数据结构,并实现查询结果的获取。在这个例子中,我们查询了 Profile.Avatar
的值以确认 update
功能已经完成。
总的来说,以上步骤就是使用 golang xorm 中操作 PostgreSQL 中的 json,array 类型的操作的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:在golang xorm中使用postgresql的json,array类型的操作 - Python技术站