Thursday, September 10, 2009

Неоднозначности Google AppEngine

Мелкие несоответствия в документации Google AppEngine
или мелкие, но неприятные особености.

Загрузка файлов.

  • В документации в примере работы с фотографиями указано, что по умолчанию для параметров загрузки файлов выдается их содержимое. В действительности выдается исходное имя файла, поэтому нужно вместо:
     self.request.get('uploadfile') 
    , использовать
     self.request.params.get('cvs').file.read() 

Кодировка строк.

  • Параметры возвращаемые self.request.get() возвращаются в виде unicode строк;
  • В базу данных тоже нужно сохранять unicode строки;
  • При редиректе нужно использовать для строк содержащих символы не входящие в ASCII выражение вида:
    sub_path = self.request.get('path')
    self.redirect('/forum?path=' + cgi.escape(sub_path.encode('utf-8')))
    , то есть перед выполнением редиректа нужно преобразовать в обычную строку.

Особенности базы данных

  • Пока обнаружил только, что желательно добавлять и удалять маленькими порциями. В первом случае можно наткнуться на ограничение во времени (5 секунд) и нагрузке при обработке запроса. В втором случае удалить более 300 объектов за раз нельзя. Цифры примерные - точные цифры получить не пытался, известно только, что за зараз можно добавить 600 объектов и раза в два меньше объектов удалить.
  • Нагрузки на процессорное время при первом получении результатов (не созданы индексы) может достигать на простых операциях вида: получить первые 25 результатов с сортировкой по дате ключу, может занять до 10 абстрактных секунд(30 секунд реальных) при последующих запросах значения падают на порядок.
  • Добавление 600 записей может использовать до 1% процессорного времени выданного для бесплатного аккаунта.
  • База основана на технологии map/reduce, и не поддерживает команды SQL кроме select. Но удобнее, как по мне, использовать нативные методы order, filter, put, fetch.
  • Можно только сравнивать на равенство больше/меньше и включение(in), операции like и под запросы не поддерживаются.
  • Для реализации операций соответствия признаку (или поиск слов, тегов) можно использовать разбиение исходного предложения на минимальные единицы с последующим сохранением этого списка, как отдельного поля в записи (можно в поле записи сохранять список), а потом при поиске использовать вхождение. Конечно, это немного не то, если нужен like, но вполне быстро срабатывает.
  • Включение работает как пересечение, то есть если есть общие элементы, то возвращается истина.
В общей сумме бесплатного аккаунта вполне хватает для маленького тестового сайтика, чтобы поэкспериментировать. В минимальной поставке идет(без дополнительных телодвижений): Django 0.96(используется как шаблонизатор), поддержка базы данных, memcached и библиотека преобразования изображений.

No comments: