Go 如何从数据存储中获取名称/密钥
找不到任何现有的Go 如何从数据存储中获取名称/密钥,go,google-cloud-platform,google-cloud-datastore,Go,Google Cloud Platform,Google Cloud Datastore,找不到任何现有的Go特定答案,因此创建一个新答案 我们的数据存储由以下列/属性组成 Name/ID电子邮件用户ID用户名 现在,我想将这些值检索到我的Gostruct中。这是我写的 type UserDetails struct { NameID string Email string `datastore:"Email"` UserID string `datastore:"UserID"` UserName string `datasto
Go
特定答案,因此创建一个新答案
我们的数据存储由以下列/属性组成
Name/ID电子邮件用户ID用户名
现在,我想将这些值检索到我的Go
struct中。这是我写的
type UserDetails struct {
NameID string
Email string `datastore:"Email"`
UserID string `datastore:"UserID"`
UserName string `datastore:UserName`
}
现在,当我获取该实体(基于种类)时,我手动设置NameID
,即
func (c DataStoreClient) GetUserDetailsByOrg(ctx context.Context, orgName string) ([]*UserDetails, error) {
var userDetails []*UserDetails
q := datastore.NewQuery(userDetailsKind).
Namespace(orgName)
keys, err := c.client.GetAll(ctx, q, &userDetails)
for i, key := range keys {
userDetails[i].NameID = key.Name
}
return userDetails, err
}
现在,我想问的问题是,这是检索
Name/ID
的正确方法,还是可以通过在struct中指定datastore:Name/ID
来检索它?您的方法很好。但是,由于您的NameID没有任何标记,因此将有一个数据存储实体属性,该名称设置为nothing。这是不必要的财产。因此,您可以将其设置为“NameID stringdatastore:”-“
以便datastore忽略它。或者,如果您没有在包外部或通过JSON导出此字段,则可以使用小写名称,如“NameID”
另一种方法是通过使用“键”字段自动获取整个键。您可以在“键字段”中了解更多信息
您的方法很好。但是,由于您的NameID没有任何标记,因此将有一个数据存储实体属性,该名称设置为nothing。这是一个不需要存储的属性。因此,您可以将其设置为“NameID string
datastore:”-“
以便数据存储忽略它。或者,如果您没有在包外部或通过JSON导出此字段,则可以使用小写名称,如“nameID”
另一种方法是通过使用“key”字段自动获取整个密钥。您可以在关键领域了解更多信息
实现接口,在实体加载期间设置字段
type UserDetails struct {
NameID string `datastore:"-"`
Email string `datastore:"Email"`
UserID string `datastore:"UserID"`
UserName string `datastore:UserName`
}
func (ud *UserDetails) LoadKey(k *datastore.Key) error {
ud.NameID = k.Name
return nil
}
func (ud *UserDetails) Load(ps []datastore.Property) error {
return datastore.LoadStruct(ud, ps)
}
func (ud *UserDetails) Save() ([]datastore.Property, error) {
return datastore.SaveStruct(ud)
}
像这样使用它:
func (c DataStoreClient) GetUserDetailsByOrg(ctx context.Context, orgName string) ([]*UserDetails, error) {
var userDetails []*UserDetails
q := datastore.NewQuery(userDetailsKind).
Namespace(orgName)
_, err := c.client.GetAll(ctx, q, &userDetails)
return userDetails, err
}
问题中的方法是有效的。KeyLoader实现的优点是,无论应用程序在哪里查询或获取实体,它都会保存几行代码
将NameID数据存储名称设置为“-”,以便属性加载器和保存程序忽略该字段。实现接口以在实体加载期间设置该字段
type UserDetails struct {
NameID string `datastore:"-"`
Email string `datastore:"Email"`
UserID string `datastore:"UserID"`
UserName string `datastore:UserName`
}
func (ud *UserDetails) LoadKey(k *datastore.Key) error {
ud.NameID = k.Name
return nil
}
func (ud *UserDetails) Load(ps []datastore.Property) error {
return datastore.LoadStruct(ud, ps)
}
func (ud *UserDetails) Save() ([]datastore.Property, error) {
return datastore.SaveStruct(ud)
}
像这样使用它:
func (c DataStoreClient) GetUserDetailsByOrg(ctx context.Context, orgName string) ([]*UserDetails, error) {
var userDetails []*UserDetails
q := datastore.NewQuery(userDetailsKind).
Namespace(orgName)
_, err := c.client.GetAll(ctx, q, &userDetails)
return userDetails, err
}
问题中的方法是有效的。KeyLoader实现的优点是,无论应用程序在哪里查询或获取实体,它都会保存几行代码
将NameID数据存储名称设置为“-”,以便属性加载程序和保存程序忽略该字段。是的,我没有注意到这一点。实际上你有打字错误
p.NameID
应该是ud.NameID
。还有一个问题,所以我有一个单独的repo文件,它有datastore.client
对象。如何从那里调用save
方法?我的意思是,我当前拥有的对象没有任何数据存储
可见性,但此代码将数据存储相关的代码绑定到存储库
和用户详细信息
文件。你知道我在说什么吗?如果加载操作的目标值满足KeyLoader或PropertyLoadSaver接口,那么数据存储包调用这些接口上的方法来加载或保存实体。数据存储访问代码(问题中的DatastoreClient)不必与实体类型位于同一个包中(问题中的详细信息)是的,我没有注意到。实际上你有打字错误。p.NameID
应该是ud.NameID
。还有一个问题,所以我有一个单独的repo文件,它有datastore.client
对象。如何从那里调用save
方法?我的意思是我当前拥有的对象,没有任何datastore
可见性,但此代码将数据存储相关代码绑定到存储库
和用户详细信息
文件。你知道我在说什么吗?如果加载操作的目标值满足KeyLoader或PropertyLoadSaver接口,则数据存储包调用这些接口上的方法来加载或保存实体数据存储访问代码(问题中的DatastoreClient)不需要与实体类型(问题中的UserDetails)位于同一个包中。