Извлечение или удаление объекта из БД Google App Engine с именем свойства Unicode - PullRequest
1 голос
/ 21 августа 2009

У меня есть тип модели Expando в моем хранилище данных App Engine, и я задаю много произвольных имен свойств. Я не считал, что не могу хранить имена свойств Unicode, и теперь я нахожусь в тревожной ситуации, когда любая попытка получить объекты такого рода или даже удалить их, чтобы избавиться от нарушителя, приводит к следующей ошибке:

Traceback (most recent call last):
  File "/base/data/home/apps/APP/1-05.335746938130078870/console/app/models/console.py", line 146, in processSource
    exec bytecode in statement_module.__dict__
  File "<string>", line 1, in <module>
  File "/base/python_lib/versions/1/google/appengine/ext/db/__init__.py", line 1461, in fetch
    return [self._model_class.from_entity(e) for e in raw]
  File "/base/python_lib/versions/1/google/appengine/ext/db/__init__.py", line 1047, in from_entity
    entity_values = cls._load_entity_values(entity)
  File "/base/python_lib/versions/1/google/appengine/ext/db/__init__.py", line 1347, in _load_entity_values
    entity_values[str(key)] = value
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe1' in position 5: ordinal not in range(128)

Теперь я изменил свой код для кодирования имен этих свойств в ascii до их сохранения, но уже слишком поздно! Поскольку существует хотя бы одна сущность с именем свойства в Unicode, я не могу получить эту сущность или удалить ее, и это означает, что средство просмотра хранилища данных возвращает «Произошла ошибка сервера». ошибка, поэтому я даже не вижу, где проблема.

Единственное, о чем я могу думать - это разбудить модуль db и изменить метод str (), но мне было бы намного проще найти способ стереть эту модель, или даже лучше, чтобы иметь возможность удалить нарушившую сущность (или сущности), не избавляясь от всех действительных.

Ответы [ 2 ]

1 голос
/ 21 августа 2009

Для дальнейшего использования вы также можете импортировать и использовать модуль google.appengine.api.datastore, который предоставляет низкоуровневый интерфейс на основе dict для хранилища данных.

Вы также можете сообщить об ошибке об этом.

1 голос
/ 21 августа 2009

Оставленный мною комментарий сработал.

Вот решение (при условии, что таких субъектов меньше 1000):

entities = db.GqlQuery("SELECT __key__ FROM ExpandoModel").fetch(1000)

for e in entities:

  try: db.get(e)
  except UnicodeEncodeError: db.delete(e)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...