2010-09-01 10 views
8

Deseo poder verificar si existe un nombre clave para mi modelo en el almacén de datos. Mi código va:Cómo verificar si la clave existe en el almacén de datos sin devolver el objeto

t=MyModel.get_by_key_name(c) 
    if t==None: 
     #key_name does not exist 

no necesito el objeto, por lo que hay una manera (que sería más rápido y cuestan menos recursos) para comprobar si el objeto existe sin devolverlo? Solo sé el nombre de la llave, no la clave.

+2

La única mejora (principalmente una de estilo) es usar 'si t es Ninguno' para el control. De lo contrario, como dicen otras respuestas, no hay una manera más rápida o menos costosa (o al menos definitivamente ninguna que esté limpia, documentada y compatible con el futuro) e incluso los trucos más sucios e indocumentados te comprarían ganancias apenas medibles, ya que el viaje de ida y vuelta a la tienda dominará de todos modos, no el costo de transferir lo que imagino que son como mucho unos pocos paquetes de datos [[si me imagino mal, vale la pena refactorizar sus modelos ;-)]]). –

Respuesta

4

No puede evitar get_by_key_name() o equivalentes relacionados con claves para comprobar si existe una clave. Tu código está bien.

1

Las conversaciones API Sobre Model.all(keys_only=False) devolver todos los nombres de las teclas cuando keys_only se establece en True

mirada a la consulta que se dispara para esto, y entonces se puede escribir una consulta similar a esto, pero sólo para su objeto y ver si se recoge o no una fila.

+4

Una consulta no es una mejor opción, incluso con keys_only. Son mucho más lentos que pasar las llaves. La única mejora en el rendimiento sería utilizar apis de bajo nivel del almacén de datos, pero no lo recomendaría porque es más complejo y más difícil de mantener. – moraes

+1

Corrígeme si me equivoco desde Todos estos pensamientos de los 30 minutos que pasé leyendo http://code.google.com/appengine/docs/python/datastore/modelclass.html sin conocimiento previo o investigación más profunda: A La consulta que recupera key_name es más rápida que recuperar el objeto para ver si la clave existe. Además, get_by_key_name() finalmente activa una consulta para recuperar el objeto si existe. Los métodos key_exists() deberían haber sido parte de la API. Solo sugerí una forma para que lo haga. – Rahul

+4

datastore.Get y datastore.Query son cosas diferentes. get_by_key_name() no realiza una consulta: construye una clave y usa datastore.Get al final, que es unas veces más rápido que un datastore.Query, incluso si se trata de una consulta de keys_only. Consulte la latencia de get y consulta: http://code.google.com/status/appengine/detail/datastore/2010/08/31#ae-trust-detail-datastore-get-latency – moraes

Cuestiones relacionadas