Вопрос

Легко ли освоить GQL тому, кто знает SQL?Как обстоят дела с Джанго/Питоном?Действительно ли App Engine упрощает масштабирование?Есть ли встроенная защита от «инъекций GQL»?И так далее...

Мне бы хотелось услышать о не столь очевидных плюсах и минусах использования движка приложений.

Ваше здоровье!

Это было полезно?

Решение

Самой явной и разочаровывающей проблемой является API хранилища данных, который выглядит великолепно, очень хорошо продуман и с ним легко работать, если вы привыкли к SQL, но имеет ограничение в 1000 строк для всех наборов результатов запроса, и вы не можете получить доступ к счетчикам. или смещения сверх этого.Я столкнулся с более странными проблемами: на самом деле я не мог добавлять или получать доступ к данным для модели, когда она превышала 1000 строк.

См. Обсуждение переполнения стека об ограничении в 1000 строк

Арал Балкан написал действительно хорошее описание этой и других проблем

При этом движок приложений — это действительно отличный инструмент, и мне очень нравится с ним работать.Он идеально подходит для развертывания микровеб-сервисов (например:json api) для использования в других приложениях.

Другие советы

Мой опыт работы с Google App Engine был отличным, и 1000 предел результатов был удаленный, вот ссылка на примечания к выпуску:

примечания к выпуску App Engine

Нет больше 1000 предела результата - это верно:С добавлением курсоров и кульминацией многих меньших стабильности данных и улучшения производительности за последние несколько месяцев, мы теперь достаточно уверены, чтобы полностью удалить максимальный предел результата.Независимо от того, делаете ли вы побочные, итерации или используете курсор, нет ограничений на количество результатов.

GQL чрезвычайно прост — это подмножество оператора SQL «SELECT», не более того.Однако это всего лишь удобный слой поверх API более низкого уровня, и весь синтаксический анализ выполняется на Python.

Вместо этого я рекомендую использовать API запросов, который является процедурным, не требует анализа во время выполнения и делает уязвимости «инъекции GQL» совершенно невозможными (хотя они в любом случае невозможны в правильно написанном GQL).API запросов очень прост:Вызовите .all() для класса модели или вызовите db.Query(modelname).Объект Query имеет методы .filter(field_and_operator, value), .order(field_and_direction) и .ancestor(entity), в дополнение ко всем возможностям, которые есть у объектов GQL (.get(), .fetch(), .count()). и т. д.) Каждый из методов Query для удобства возвращает сам объект Query, поэтому их можно объединить в цепочку:

результаты = MyModel.all().filter("foo =", 5).order("-bar").fetch(10)

Эквивалентно:

results = MyModel.gql("WHERE foo = 5 ORDER BY bar DESC LIMIT 10").fetch()

Серьезным недостатком при работе с AppEngine было ограничение в 1 тыс. запросов, о котором уже упоминалось в комментариях.Однако я не упоминал о том, что существует встроенный сортируемый порядок, с помощью которого вы можете обойти эту проблему.Из кулинарной книги Appengine:

def deepFetch(queryGen,key=None,batchSize = 100):
  """Iterator that yields an entity in batches.

  Args:
    queryGen: should return a Query object
    key: used to .filter() for __key__
    batchSize: how many entities to retrieve in one datastore call

  Retrieved from http://tinyurl.com/d887ll (AppEngine cookbook).
  """

  from google.appengine.ext import db

   # AppEngine will not fetch more than 1000 results
  batchSize = min(batchSize,1000)

  query = None
  done = False
  count = 0

  if key:
    key = db.Key(key)

  while not done:
    print count
    query = queryGen()
    if key:
      query.filter("__key__ > ",key)
    results = query.fetch(batchSize)
    for result in results:
      count += 1
      yield result
    if batchSize > len(results):
      done = True
    else:
      key = results[-1].key()

Приведенный выше код вместе с Remote API (см. Эта статья) позволяет вам получить столько объектов, сколько вам нужно.

Вы можете использовать приведенный выше код следующим образом:

def allMyModel():
  q = MyModel.all()

myModels = deepFetch(allMyModel)

Поначалу у меня был тот же опыт, что и у других, перешедших с SQL на GQL — довольно странно не иметь возможности выполнять соединения, подсчитывать более 1000 строк и т. д.Теперь, когда я проработал с ним несколько месяцев, мне очень нравится движок приложения.Я переношу на него все свои старые проекты.

Я использую его для размещения нескольких веб-приложений с высоким трафиком (в пиковое время одно из них получает 50 тысяч обращений в минуту).

Google App Engine не использует реальную базу данных и, по-видимому, использует какую-то распределенную хэш-карту.Это приведет к различным вариантам поведения, которые люди, привыкшие к SQL, поначалу просто не увидят.Так, например, ожидается, что получение COUNT элементов в обычном SQL будет быстрой операцией, но с GQL это не будет работать так же.

Вот еще несколько проблем:

http://blog.burnaev.com/2008/04/gql-limitations.html

По моему личному опыту, это корректировка, но кривая обучения в порядке.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top