Pregunta

Es GQL fácil de aprender para alguien que conoce SQL? ¿Cómo es Django / Python? App Engine no realmente hacer el escalamiento? ¿Hay alguna protección incorporada contra las "inyecciones" GQL? Y así sucesivamente ...

Me gustaría saber las subidas no tan obvias y bajadas de usar motor de aplicación.

Saludos!

¿Fue útil?

Solución

El problema más evidente y frustrante es la API de almacén de datos, que se ve muy bien y está muy bien pensado y fácil de trabajar si se utilizan para SQL, pero tiene un límite de 1.000 fila a través de todos los conjuntos de resultados de la consulta, y se puede' conteos de acceso a t o compensaciones más allá de eso. Me he topado con problemas más extrañas, con no realmente ser capaz de añadir o acceso a datos para un modelo una vez que va más allá de 1000 filas.

Vea la desbordamiento de pila discusión sobre el límite de 1.000 fila

escribió un muy buen resumen de este y otros problemas

Una vez dicho esto, el motor de aplicación es realmente una gran herramienta a tener en las disposición, y me gusta mucho trabajar con él. Es perfecto para el despliegue de servicios web micro (por ejemplo: JSON de API). Utilizar en otras aplicaciones

Otros consejos

Mi experiencia con el motor de aplicación de Google ha sido grande, y la 1000 límite resultado ha sido eliminado , aquí hay un enlace a las notas de la versión:

liberación

app-motor observa

  

No más límite de 1.000 resultado - Eso es   derecha: con la adición de cursores y   la culminación de muchos más pequeños   la estabilidad y el rendimiento del almacén de datos   mejoras en los últimos meses,   ahora estamos lo suficientemente seguras como para eliminar   el máximo resultado limitar por completo.   Ya sea que esté haciendo una zona de alcance,   la iteración, o el uso de un cursor, no hay   no hay límites en el número de los resultados.

GQL es extremadamente simple - es un subconjunto del SQL 'SELECT' declaración, nada más. No es más que una capa de la conveniencia sobre la parte superior de las API de bajo nivel, sin embargo, y todo el análisis se realiza en Python.

En lugar de ello, recomiendo el uso de la API de consulta, que es de procedimiento, no requiere el análisis en tiempo de ejecución, y hace vulnerabilidades 'GQL inyección' totalmente imposible (a pesar de que son imposibles en GQL adecuadamente por escrito de todos modos). La API de consulta es muy simple: Call .all () en una clase de modelo, o llame db.Query (ModelName). El objeto de consulta tiene .Filter (field_and_operator, valor), .order (field_and_direction) y .ancestor (entidad) métodos, además de todas las instalaciones GQL objetos tienen (.get (), .fetch (), .count ()) , etc.) Cada uno de los métodos de consulta devuelve el objeto de consulta en sí por conveniencia, por lo que les puede encadenar:

  

Resultados = MyModel.all () filtrar ( "foo =", 5) .order ( "- bar").. Fetch (10)

es equivalente a:

  

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

Un inconveniente importante cuando se trabaja con AppEngine era el límite de consulta 1k, que ha sido mencionado en los comentarios ya. Lo que no he visto mencionado es sin embargo el hecho de que hay una incorporado con el fin ordenable, con el que puede solucionar este problema. Del libro de cocina 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()

El código anterior junto con API remoto (ver este artículo ) permite que le permite recuperar tantas entidades como sea necesario.

Puede utilizar el código siguiente:

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

myModels = deepFetch(allMyModel)

Al principio no tenía la misma experiencia que otros que la transición de SQL para GQL - un poco raro al no ser capaz de hacer combinaciones, contar más de 1000 filas, etc. Ahora que he trabajado con él durante unos meses me encanta el motor de aplicación. Estoy portar todos mis viejos proyectos en la misma.

Lo uso para albergar varias aplicaciones web de alto tráfico (en hora punta uno de ellos se realiza un 50k minutos.)

Google App Engine no utiliza una base de datos real, y al parecer utiliza algún tipo de mapa hash distribuida. Esto se presta a algunos comportamientos diferentes que las personas que están acostumbradas a SQL no se va a ver al principio. Así, por ejemplo, la obtención de un número de elementos en SQL normal se espera que sea una operación rápida, pero con GQL simplemente no va a funcionar de la misma manera.

Aquí hay algunas cuestiones más:

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

En mi experiencia personal, es un ajuste, pero la curva de aprendizaje está muy bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top