2012-04-05 5 views
0

J'ai une instance SimpleDB que je mets à jour et lu à l'aide boto pour Python:Faire des changements persistants dans Boto

sdb = boto.connect_sdb(access_key, secret_key) 
    domain = sdb.get_domain('DomainName') 
    itemName = 'UserID' 
    itemAttr = {'key1': 'val1', 'key2': val2} 
    userDom.put_attributes(itemName, itemAttr) 

Cela fonctionne un prévu. Un nouvel élément avec le nom 'UserID' et les valeurs val1 et val2 seront insérés dans le domaine.

Maintenant, le problème que je suis confronté est que si je requête domaine juste après la mise à jour de ses attributs,

query = 'select * from `DomainName` where key1=val1' 
    check = domain.select(query) 
    itemName = check.next()['key2'] 

je vais faire une erreur parce que les valeurs de la ligne n'a pas pu être trouvé. Cependant, si j'ajoute un time.sleep (1) entre l'écriture et la lecture tout fonctionne.

Je suppose que ce problème est dû au fait que put_atributes signale la base de données pour l'écriture, mais n'attend pas que cette modification ait été rendue persistante. J'ai également essayé d'écrire en utilisant la création d'un élément, puis en enregistrant cet élément (item.save()) sans grand succès. Est-ce que quelqu'un sait comment je peux m'assurer que les valeurs ont été écrites dans l'instance de SimpleDB avant de passer aux opérations suivantes?

Merci.

Répondre

0

Le problème ici est que SimpleDB est, par défaut, cohérent par la suite. Ainsi, lorsque vous écrivez des données et que vous essayez immédiatement de les lire, vous n'êtes pas sûr d'obtenir les données les plus récentes, même si vous êtes assuré que les données seront finalement cohérentes. Avec SimpleDB, finalement signifie généralement moins d'une seconde, mais il n'y a aucune garantie sur combien de temps cela pourrait prendre. Cependant, il existe un moyen de dire à SimpleDB que vous voulez une vue cohérente des données et que vous êtes prêt à l'attendre, si nécessaire. Vous pouvez le faire en modifiant légèrement le code de votre requête:

query = 'select * from `DomainName` where key1=val1' 
check = domain.select(query, consistent_read=True) 
itemName = check.next()['key2'] 

Ceci devrait toujours renvoyer les dernières valeurs.

+0

Merci, cela a fonctionné parfaitement. J'ai rencontré des problèmes en utilisant constant_read parce que j'utilisais boto version 1.9b, mis à niveau vers 2.3.0 et résolu. – angelrh

Questions connexes