首页 文章

如何处理仅限管理员GAE-Datastore更新

提问于
浏览
0

我创建了我的第一个App Engine项目 . 我正在使用 Cloud endpoints 和数据存储区为移动应用程序提供后端 . 用户只会使用现有内容,他们无法更改数据存储内容 .

因此,数据存储区的内容将由我独家管理 . 我有不到10种实体,大约5000个对象 . 这些对象需要每月大约两次部分更新 .

为了在我这边生成这些对象,我使用了很少的本地sqlite数据库,我也从网上汇总了一些信息 .

我的问题是,进行这些数据存储更新的最佳方法是什么?我的第一个想法是使用 endpoints 进行插入/更新操作,并确保它们只能由我访问 . 然后,每月两次,我将使用我的“管理客户端”,生成新的东西,并使用安全的Web服务来更新数据存储内容 .

但我想知道是否有更合适的方法 . 特别是在效率和数据一致性方面 . 如果用户在更新过程中要求提供内容会发生什么,他会有部分最新的内容 .

也许我可以使用其他我不知道的API?或者只是在应用引擎端使用某种脚本?

EDIT

我的一个 Entity 几乎没有 EmbeddedEntities . 对我来说这不是强制性的,但我认为检索它们的方式会更便宜,而且我不需要从其他地方访问它们 .

但是使用这个模型,我找不到如何使用bulkloader上传我的数据,也找不到RemoteApi . 在这两种情况下,embeddedEntities都没有填充:对于 DataViewer 中的嵌入实体的每个字段,我都有 <missing> ,并且在我的 endpoints 中没有返回任何内容 . 如果我使用我的插入 endpoints ,它可以工作 . 此外,要清楚,尽管有嵌入式实体,一切都有效 .

我的模特

@Entity
public class MyEntity {

    @Id
    private Long id;
    private String name;
    private MyEmbeddedEntity embeddedEntity;
    ...
    @Embedded
    public MyEmbeddedEntity getEmbeddedEntity() {
        return embeddedEntity;
    }
}

RemoteApi

EmbeddedEntity embeddedEntity = new EmbeddedEntity();
embeddedEntity.setProperty("name", "testEmbedded");

Entity entity = new Entity("MyEntity", 1L);
entity.setProperty("name", "test");
entity.setProperty("embeddedEntity", embeddedEntity);

...

datastore.put(entity);

Bulkloader

我用create_bulkloader_config生成了yaml配置 . 我设置了simplexml连接器,xpath_to_nodes = / list / MyEntities对应于我的xml结构 .

我用@Embedded注释尝试了不同的方法 . 我也试过不同的实体键 . 如果我使用我的 endpoints 插入实体,并使用bulkloader和相同的yaml配置导入数据,则我生成的xml不包含嵌入的实体(而在DataViewer中它们是可见的) .

1 回答

  • 1

    您可以使用bulkuploader,或编写自己的上传器版本(在app.yaml中使用“login:admin”保护处理程序) .

    您可以使用事务(如果您的数据模型允许)来避免更新过程中出现问题,或者您可以在上载过程中使用“ready:true | false”等临时属性 .

相关问题