Frage

Ist GQL einfach für jemanden zu lernen, die SQL-weiß? Wie ist Django / Python? Leistet App Engine wirklich Skalierung einfach? Gibt es einen eingebauten Schutz gegen „GQL Injections“? Und so weiter ...

Ich würde gerne die nicht so offensichtlichen Höhen und Tiefen mit App Engine hören.

Cheers!

War es hilfreich?

Lösung

Das krasseste und frustrierende Problem ist der Datenspeicher api, das sieht gut aus und ist sehr gut durchdacht und einfach zu handhaben, wenn Sie SQL verwendet werden, hat aber eine 1000 Zeilenlimit für alle Abfrage Resultsets, und Sie können‘ t Zugriffszählungen oder Offsets darüber hinaus. Ich habe in eigenartige Probleme läuft, mit nicht wirklich in der Lage ist, um Daten hinzuzufügen, oder den Zugriff für ein Modell, sobald es über 1000 Zeilen geht.

Sehen Sie die Stack-Überlauf Diskussion über das 1000 Zeilenlimit

Aral Balkan eine wirklich gute Zusammenfassung dieser und anderer Probleme

schrieb

Having said that, App Engine ein wirklich großartiges Werkzeug, um diejenigen zur Verfügung zu haben, und ich genieße wirklich mit ihm zu arbeiten. Es ist perfekt für Micro Web-Service bereitstellen (zB: json api). In anderen Anwendungen zu verwenden,

Andere Tipps

Meine Erfahrung mit Google App Engine ist großartig, und die 1000 Ergebnis Grenze wurde entfernt , hier ist ein Link zu der Release Notes:

app-Engine Release Notes

  

Nicht mehr 1000 Ergebnis Grenze - Das ist   rechts: mit Zusatz von Cursorn und   der Höhepunkt von vielen kleineren   Datastor Stabilität und Leistung   Verbesserungen in den letzten paar Monaten,   wir sind jetzt sicher genug, um zu entfernen,   das maximale Ergebnis insgesamt begrenzen.   Egal, ob Sie tun eine holen,   Iterieren oder einen Cursor zu verwenden, gibt es   keine Grenzen für die Anzahl der Ergebnisse.

GQL ist extrem einfach - es ist eine Teilmenge der SQL-Anweisung ist ‚SELECT‘, nichts weiter. Es ist nur eine Bequemlichkeit Schicht über der Oberseite der unteren Ebene APIs, aber, und das Parsing in Python getan wird.

Stattdessen empfehle ich den Query-API, das Verfahren ist, erfordert keine Laufzeit Parsing und macht ‚GQL Injektion‘ Schwachstellen völlig unmöglich (obwohl sie in richtig geschrieben GQL ohnehin unmöglich sind). Der Query-API ist sehr einfach: Rufen Sie .all () auf einer Modellklasse, oder rufen Sie db.Query (Modellname). Das Query-Objekt hat .filter (field_and_operator, Wert), .order (field_and_direction) und .ancestor (entity) Methoden, zusätzlich zu allen Einrichtungen GQL Objekte (.get (), .fetch (), .count ()) Jede der Query-Methoden, etc.) gibt das Objekt Abfrage selbst für die Bequemlichkeit, so dass Sie ketten können sie:

  

Ergebnisse = MyModel.all () -Filter ( "foo =", 5) .order ( "- bar").. Fetch (10)

Ist äquivalent zu:

  

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

Ein großer Nachteil, wenn sie mit App Engine arbeiten war das 1k Abfragelimit, das bereits in den Kommentaren erwähnt wurde. Was ich allerdings nicht erwähnt, ist die Tatsache gesehen, dass es eine sortierbare auftrag eingebaut ist, mit dem Sie dieses Problem umgehen können. Vom appengine Kochbuch:

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()

Der obige Code zusammen mit Remote API (siehe diesem Artikel ) erlaubt Sie so viele Einheiten abzurufen, wie Sie benötigen.

Sie können den obigen Code wie folgt verwendet werden:

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

myModels = deepFetch(allMyModel)

Zuerst hatte ich die gleiche Erfahrung wie andere, die von SQL zu GQL transitioned - irgendwie komisch seinen nicht in der Lage zu tun beitritt, mehr als 1000 Zeilen zählen, usw. Nun, da ich mit ihm für ein paar gearbeitet habe Monate ich liebe die App Engine. Ich bin alle meine alten Projekte auf sie zu portieren.

Ich benutze es mehr High-Traffic-Web-Applikationen zu hosten (zu Spitzenzeiten ein von ihnen bekommen 50k eine Minute schlägt.)

Google App Engine keine aktuelle Datenbank verwenden und offenbar verwendet eine Art verteilte Hash-Karte. Dies eignet sich für einige andere Verhaltensweisen, die Menschen, die auf SQL gewöhnt sind gerade nicht auf den ersten gehen zu sehen. So zum Beispiel eine Anzahl der Elemente in regelmäßigen SQL immer erwartet wird, einen schnellen Betrieb zu sein, aber mit GQL ist es einfach nicht die gleiche Art und Weise zur Arbeit gehen.

Hier sind einige weitere Probleme:

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

In meiner persönlichen Erfahrung, es ist eine Einstellung, aber die Lernkurve ist in Ordnung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top