Google App Engine: несет ли приложение ответственность за сохранение ссылочной целостности при сохранении сущности, имеющей ссылочные свойства? - PullRequest
4 голосов
/ 06 мая 2011

при сохранении сущности, имеющей ссылочные свойства, отвечает ли приложение за проверку того, что сущности, на которые ссылаются ссылочные свойства, уже существуют в хранилище данных? Во время модульного тестирования с помощью datastore_v3_stub я обнаружил, что механизм приложений с радостью сохранит сущность A, с которой связано эталонное свойство B (а B еще не существует в хранилище данных). далее, когда A сохраняется, B не сохраняется. Когда вы впоследствии получаете A из хранилища данных и пытаетесь перейти к B, вы получаете исключение. Это ожидаемое поведение?

Пример кода:

user = MyUser(key_name='2',
            name='my user 2')
        e = db.get(user.key())
        self.assertTrue(e is None) # user does not exist in datastore yet
        preferences = Preferences(user=user) # user is a ReferenceProperty
       preferences.put()
        e = db.get(user.key())
        self.assertTrue(e is None) # user still does not exist in datastore
        e = db.get(preferences.key())
        self.assertFalse(e is None) # but preferences were still stored
e.user will give exception

EDIT: я новичок в Python, но можно ли написать класс, который подклассов db.Model и переопределяет метод put для обеспечения ссылочной целостности (с помощью некоторого отражения) перед вызовом put из db.Model. Затем я могу просто создать подкласс этого класса для обеспечения ссылочной целостности в моих модельных классах (например, A, B выше)

это то, что я придумал. любой гуру может пересмотреть код:

for name, property in obj.properties().items():
            if isinstance(property, db.ReferenceProperty):
                try:
                    value = getattr(essay, name)
                except datastore_errors.Error:
                    print name, property, 'does not exist in datastore yet'
                    continue
                key = value.key()
                o = db.get(key)
                if o is None:
                    print name, property, value, 'does not exist in datastore yet'

1 Ответ

3 голосов
/ 06 мая 2011

Да. Это ответственность приложения.

Цитировать:

Как и в случае значения Key, значение ссылочного свойства может ссылаться на несуществующий объект данных. Если ссылка на объект удаляется из хранилища данных, ссылки на объект не обновляются. При доступе к несуществующей сущности возникает ReferencePropertyResolveError.

взято из документов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...