2010-11-07 2 views
2

Je dois vérifier si l'élément est dans la banque de données avant de le mettre à jour.Comment puis-je mettre à jour les informations dans mon magasin de données?

J'ai 2 listes: UNIQUES = ["B","K","V"] et COUNTS = [5, 10, 3]

Ceci est le modèle:

class Rep(db.Model): 
    mAUTHOR = db.UserProperty(auto_current_user=True) 
    mUNIQUE = db.TextProperty() 
    mCOUNT = db.IntegerProperty() 
    mDATE = db.DateTimeProperty(auto_now_add=True) 

Cette fonction met à jour la base de données:

def write_to_db(S, C): 
    REP = Rep(mUNIQUE=S, mCOUNT=C) 
    db.put(REP) 

Inspiré par ce page je tente:

for i in range(len(UNIQUES)):    
    C_QUERY = Rep.all() 
    C_QUERY.filter("mAUTHOR =", user) 
    C_QUERY.filter("mUNIQUE =", UNIQUES[i]) 
    C_RESULT = C_QUERY.fetch(1) 
    if C_RESULT: 
     C = C_RESULT.mCOUNT + COUNTS[i] 
     S = db.Text(UNIQUES[i]) 
     write_to_db(S,C) 
    else: 
     C = COUNTS[i] 
     S = UNIQUES[i] 
     write_to_db(S, C) 

Mais le résultat n'est pas ce que j'attends. C_RESULT est toujours vide. et au lieu de mettre à jour, un nouvel enregistrement est créé. Qu'est-ce que je fais mal? Merci!

EDIT3: Problème résolu

Selon le commentaire de David Underhill Je mis à jour le code et il fonctionne maintenant.

 if C_RESULT: 
      rep=C_RESULT[0] 
      rep.mCOUNT+=COUNTS[i] 
      rep.put() 

EDIT2: question

Comment puis-je mettre à jour cette requête et de le remettre à jour les informations?

C_QUERY = Rep.all() 
C_QUERY.filter("mAUTHOR =", user) 
C_QUERY.filter("mUNIQUE =", UNIQUES[i]) 
C_RESULT = C_QUERY.fetch(1)     

Je souhaite modifier mCOUNT, puis l'écrire dans le magasin de données. Comment je fais ça? Cela ressemble à exactement la même chose qu'ils font dans this page mais je ne pouvais pas le faire fonctionner. Merci de votre aide.

EDIT

I mis à jour le code par la réponse de David Underhill. Cela a résolu le problème (mais la fonctionnalité n'est pas correcte, je ne suis pas sûr que ce soit une question différente).

for i in range(len(UNIQUES)):       
     C_QUERY = Rep.all() 
     C_QUERY.filter("mAUTHOR =", user) 
     C_QUERY.filter("mUNIQUE =", UNIQUES[i]) 
     C_RESULT = C_QUERY.fetch(1)     
     if C_RESULT: 
      C = C_RESULT[0].mCOUNT + COUNTS[i] 
      S = UNIQUES[i] 
      write_to_db(S, C) 
     else: 
      C = COUNTS[i] 
      S = UNIQUES[i] 
      write_to_db(S, C) 

Répondre

1

Le problème est que la requête tente de filtrer mUNIQUE. Cependant, vous avez déclaré mUNIQUE comme db.TextProperty qui est jamais indexé. Par conséquent, votre requête ne trouve jamais aucun résultat.

Solution: Changement mUNIQUE à un db.StringProperty (qui est indexé par défaut).

Vous devez également envisager de mettre à jour Rep dans un transaction - le code actuel peut échouer à la propriété COUNTS[i] si deux demandes tentent de mettre à jour la même entité simultanément. En outre, vous pouvez mettre à jour S = db.Text(UNIQUES[i]) à S = UNIQUES[i].

+0

@David Underhill: Merci beaucoup! Cela a résolu le problème. J'ai ajouté le code mis à jour ci-dessus. Pouvez-vous également suggérer des solutions pour corriger le reste du code? Comment mettre à jour juste cet article? La façon dont il est maintenant met à jour toute la base de données; donc il y a toujours 1 objet dedans.(désolé, je suis toujours très confus au sujet de la notation par points et quel objet est quoi) Merci encore. – Zeynel

+0

De rien. Je ne suis pas sûr de ce que vous entendez par "ceci" dans "Comment mettre à jour juste cet article?" Peut-être pourriez-vous fournir plus de détails sur ce que vous essayez d'accomplir (ici c'est bien, dans une autre question pourrait être mieux). –

+0

@David Underhill: merci. J'ai commencé une nouvelle question: http://stackoverflow.com/questions/4119560/updating-just-1-entity-in-datastore – Zeynel

Questions connexes