Pergunta

Eu estou em uma situação onde eu preciso relações entidade Motor extensão Google App em uma consulta como no modelo de banco de dados Django . Estou usando ListPropertys para relacionamentos um-para-muitos, assim:

class Foo(db.Model): bars = db.ListProperty(db.Key)
class Bar(db.Model): eggs = db.ListProperty(db.Key)

E eu gostaria de realizar uma consulta que faz o seguinte:

# Foo.filter('bars.eggs =', target_egg)
[foo
for egg in eggs if egg == target_egg
for eggs in bar.eggs
for bar in foo.bars
for foo in Foo.all()]

A compreensão parece radicalmente ineficiente. Eu realmente gostaria de realizar uma consulta como na parte comentado, mas não se parece com o GQL sintaxe permite consultas contra os atributos de atributos:

   SELECT * FROM <kind>
    [WHERE <condition> [AND <condition> ...]]
    [ORDER BY <property> [ASC | DESC] [, <property> [ASC | DESC] ...]]
    [LIMIT [<offset>,]<count>]
    [OFFSET <offset>]

  <condition> := <property> {< | <= | > | >= | = | != } <value>
  <condition> := <property> IN <list>
  <condition> := ANCESTOR IS <entity or key>
Foi útil?

Solução

Você está certo, o armazenamento de dados do App Engine não permite esse tipo de consulta. E você está certo de que a compreensão da lista é ineficiente. Considere-se, porém, que isso é muito bonito exatamente o que um banco de dados relacional que quando você executar uma consulta com associações como o seu um - o banco de dados tem que executar o mesmo O (n ^ 3) trabalho que você está fazendo aqui - a única diferença é que você está fazendo isso em Python, e com o tempo adicional de ida e volta. Desde App Engine é projetado para escala, não é realmente feito para este tipo de consultas.

Normalmente, porém, há uma maneira você pode denormalise seu modelo um pouco para facilitar este processo, movendo algumas das propriedades que você precisa para acesso para o modelo Foo, ou se você está fazendo agregados, movendo total para o Foo modelo. É difícil dar soluções concretas, sem mais de uma idéia de qual é o problema que você está tentando resolver, apesar de tudo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top