2009-04-01 6 views
7

Ist GQL für jemanden, der SQL kennt, leicht zu erlernen? Wie ist Django/Python? Macht App Engine das Skalieren wirklich einfach? Gibt es einen eingebauten Schutz gegen "GQL-Injektionen"? Und so weiter ...Welche Entwicklung haben Sie in der Google App Engine?

Ich würde gerne die nicht so offensichtlichen Höhen und Tiefen der Verwendung von App-Engine hören.

Prost!

Antwort

4

Das krasseste und frustrierendes Problem ist der Datenspeicher api, das sieht gut aus und ist sehr gut durchdacht und einfach zu handhaben, wenn Sie SQL verwendet werden, aber ein 1000 Zeilenlimit für alle Query-Resultset hat, und Sie können Zugriffszahlen oder Offsets darüber hinaus. Ich bin in verrücktere Probleme geraten, die Daten für ein Modell nicht wirklich hinzufügen oder darauf zugreifen können, wenn es über 1000 Zeilen hinausgeht.

Siehe Stack Overflow discussion about the 1000 row limit

Aral Balkan wrote a really good summary of this and other problems

gesagt haben, dass App Engine ein wirklich großartiges Werkzeug, um diejenigen zur Verfügung zu haben, und ich mit ihm arbeiten wirklich genießen. Es ist perfekt für die Bereitstellung von Micro-Web-Services (z. B. JSON-APIs), die in anderen Apps verwendet werden können.

+0

Behoben! http://stackoverflow.com/questions/264154/google-appengine-how-to-fetch-more-than-1000 –

4

GQL ist extrem einfach - es ist eine Teilmenge der SQL 'SELECT' Anweisung, nichts mehr. Es handelt sich jedoch nur um eine Convenience-Schicht über den APIs der unteren Ebenen, und das gesamte Parsen wird in Python durchgeführt.

Stattdessen empfehle ich die Verwendung der Abfrage-API, die prozedural ist, erfordert keine Laufzeit-Parsing und macht 'GQL-Injektion' Schwachstellen völlig unmöglich (obwohl sie in ordnungsgemäß geschriebenen GQL sowieso unmöglich sind). Die Abfrage-API ist sehr einfach: Rufen Sie .all() für eine Model-Klasse auf oder rufen Sie db.Query (Modellname) auf. Das Query-Objekt hat die Methoden .filter (field_and_operator, value), .order (field_and_direction) und .ancestor (entity), zusätzlich zu allen Möglichkeiten, die GQL-Objekte haben (.get(), .fetch(), .count()) usw.) Jede der Query-Methoden gibt das Objekt Abfrage selbst für die Bequemlichkeit, so dass Sie diese Kette:

Ergebnisse = MyModel.all() Filter ("foo =", 5) .order (“. -Bar ") holen (10)

entspricht:

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

1

Google App Engine verwendet keine tatsächliche Datenbank und verwendet offenbar eine Art verteilte Hash-Map. Dies wird sich für verschiedene Verhaltensweisen eignen, die Leute, die mit SQL vertraut sind, einfach nicht sehen werden. So wird zum Beispiel erwartet, dass ein COUNT von Elementen in regulärem SQL eine schnelle Operation ist, aber mit GQL wird es einfach nicht auf die gleiche Weise funktionieren.

Hier sind einige weitere Fragen:

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

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

4

Ein großer Nachteil bei der Arbeit mit AppEngine war das 1k-Abfrage-Limit, das bereits in den Kommentaren erwähnt wurde. Was ich jedoch nicht erwähnt habe, ist die Tatsache, dass es eine eingebaute sortierbare Reihenfolge gibt, mit der 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 this article) ermöglicht es Ihnen, 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) 
2

Zuerst hatte ich die gleiche Erfahrung wie andere, die von SQL zu GQL transitioned - irgendwie komisch nicht in der Lage sein JOINs zu tun, zählt mehr als 1000 Zeilen, usw. Jetzt, nachdem ich ein paar Monate damit gearbeitet habe, bin ich total begeistert von der App-Engine. Ich portiere alle meine alten Projekte darauf.

Ich benutze es mehrere High-Traffic-Web-Applikationen zu hosten (zu Spitzenzeiten eine von ihnen bekommt trifft 50k eine Minute.)

7

Meine Erfahrung mit Google App Engine war großartig, und die 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 der Hinzufügung von Cursors und dem Höhepunkt vieler kleiner Datenspeicherstabilität und -performance Verbesserungen in den letzten Monaten, sind wir jetzt zuversichtlich genug, die maximale Ergebnisgrenze insgesamt zu entfernen. Unabhängig davon, ob Sie einen Abruf ausführen, iterieren oder einen Cursor verwenden, gibt es keine Beschränkungen für die Anzahl der Ergebnisse.