Как обрабатывать только административные обновления GAE-Datastore

62
5

Я создал свой первый проект App Engine. Я использую облачные конечные точки и хранилище данных, чтобы обеспечить бэкэнд для мобильного приложения. Пользователи будут использовать только существующий контент, у них не будет возможности изменить содержимое хранилища данных.

Таким образом, содержание хранилища данных будет управляться мной исключительно. У меня менее 10 видов объектов и около 5000 объектов. Эти объекты будут нуждаться в частичном обновлении примерно два раза в месяц.

Чтобы сгенерировать эти объекты на моей стороне, я использую несколько локальных баз данных sqlite, и я также собираю некоторую информацию из Интернета.

Мой вопрос - лучший способ сделать эти обновления данных? Моя первая мысль заключалась в том, чтобы использовать конечные точки для операций вставки/обновления и обеспечивать их доступность только для меня. Затем два раза в месяц я использовал свой "админ-клиент", чтобы создать новый материал и использовать защищенные веб-службы для обновления содержимого хранилища данных.

Но мне интересно, есть ли для этого более подходящий способ. Особенно с точки зрения эффективности и согласованности данных. Что произойдет, если пользователь запрашивает контент во время процесса обновления, у него будет что-то частично обновленное.

Может быть, я могу использовать другой API, о котором я не знаю? Или просто используйте какой-то скрипт на стороне приложения?

РЕДАКТИРОВАТЬ

У одного из моих Entity есть несколько EmbeddedEntities. Это не обязательно для меня, но я подумал, что будет дешевле, чтобы получить их, и мне не нужно обращаться к ним из других источников.

Но с этой моделью я не могу найти, как использовать загрузчик для загрузки моих данных или RemoteApi. В обоих случаях встроенные элементы не заполняются: у меня есть <missing> для всех полей встроенных объектов в DataViewer, и ничего не возвращается в моих конечных точках. Если я использую конечную точку вставки, она работает. Кроме того, чтобы быть ясным, несмотря на встроенные объекты, все работает.

Моя модель

@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

Я создал конфигурацию yaml с помощью create_bulkloader_config. Я установил соединитель simplexml с xpath_to_nodes =/list/MyEntities, соответствующим структуре моего xml.

Я пробовал разные подходы с аннотациями @Embedded. Я также пробовал с разными ключами. Если я вставляю объект с моей конечной точкой и импортирую данные с загрузчиком и той же конфигурацией yaml, мой сгенерированный xml не содержит внедренных объектов (тогда как они видны в DataViewer).

спросил(а) 2021-01-19T18:36:44+03:00 2 месяца, 3 недели назад
1
Решение
62

Вы можете использовать bulkuploader или написать собственную версию загрузчика (используйте "login: admin" в app.yaml, который вы защищаете обработчики).

Вы можете использовать транзакции (если ваша модель данных позволяет) избежать проблем во время процесса обновления, или вы можете использовать временное свойство, подобное "ready: true | false" во время процесса загрузки.

ответил(а) 2021-01-19T18:36:44+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема