go - 如何在谷歌数据存储中更新实体的特定字段
问题描述
我有以下结构:
type MyEntity struct {
DSGeneratedID int64 json:"-" datastore:"-"
Phone string json:"phone"
Name string json:"name"
Address string json:"address"
}
在谷歌数据存储中,我存储如下:
Name/ID:
id=5101067637358592
Name:
Sandy
Phone:
9275939377
Address:
24, Nehru road, Chennai
说,我想更改电话号码的值。现在,如果我知道“key.id”值,我可以使用下面的代码来实现我想要的。
entity := publisher.MyEntity{
Phone: "9472749280",
Name: "Sandy",
Address: "24, Nehru road, Chennai",
}
key := datastore.IDKey("Mine", **5101067637358592**, nil)
client.Put(ctx, key, &entity)
但为此我需要这个密钥5101067637358592。现在,如果我知道姓名、地址和旧电话号码,有没有办法获得钥匙/身份证?
或者如果有任何其他方法可以做到这一点,请告诉我。
解决方案
从标准任务类
// Task is the model used to store tasks in the datastore.
type Task struct {
Desc string `datastore:"description"`
Created time.Time `datastore:"created"`
Done bool `datastore:"done"`
id int64 // The integer ID used in the datastore.
}
您可以从查询中获取已知字段的键 ID。
var tasks []*Task
query := datastore.NewQuery("Task").Order("created")
keys, err := client.GetAll(ctx, query, &tasks)
if err != nil {
return nil, err
}
// Set the id field on each Task from the corresponding key.
for i, key := range keys {
tasks[i].id = key.ID
}
然后,使用事务将实体更新到数据存储区。从文档中。
tx, err := client.NewTransaction(ctx)
if err != nil {
log.Fatalf("client.NewTransaction: %v", err)
}
var task Task
if err := tx.Get(taskKey, &task); err != nil {
log.Fatalf("tx.Get: %v", err)
}
task.Priority = 5
if _, err := tx.Put(taskKey, &task); err != nil {
log.Fatalf("tx.Put: %v", err)
}
if _, err := tx.Commit(); err != nil {
log.Fatalf("tx.Commit: %v", err)
}
推荐阅读
- devexpress - DevExpress XAF 登录天蓝色广告后我的详细信息和注销未显示
- reactjs - 在反应选择中到达底部时如何防止 ArrowDown?
- javascript - 将构建文件夹部署到 Netlify 时获取空白页面
- javascript - 如何在Javascript中比较数组和数据库字段值中的不相等值?
- javascript - SelectPicker 不发送值来选择 ajax
- ios - 将 UIbutton 值提取到另一个 UIbutton 进行计算
- sql - 从 Redshift 获取单元格或行的历史值
- android - 为什么这个 Kotlin/Android 代码会抛出 java.lang.ArrayIndexOutOfBoundsException?
- reactjs - 如何使用 react-open-app 自动打开应用程序?
- vue.js - Vue3是否可以从孩子端更改提供->注入提供的数据?