Y a-t-il un bon moyen de stocker un dictionnaire Python dans le magasin de données? Je veux faire quelque chose comme ce qui suit:
from google.appengine.ext import db class Recipe(db.Model): name = db.StringProperty() style = db.StringProperty() yeast = db.StringProperty() hops = db.ListofDictionariesProperty()
7 Réponses :
sérialiser un dict avec Un avantage de la reproduction sur le décapage est que les données sont lisibles dans la base de données, même interrogées dans des cas désespérés. P> REC code> est un bon moyen de le faire. Vous pouvez ensuite le reconstituer avec
eval code> ou si vous ne faites pas confiance aux données, un " EVAL SAFE ". P>
JSON est généralement plus sûr que Eval.
Je n'aurai probablement pas besoin d'interroger ce champ, mais j'aime bien cela j'ai la possibilité. Aussi, corrigez-moi si je me trompe, mais n'utiliserais pas RECI et utiliser JSON a la même sortie dans ce cas?
Même avec "Safe Eval", REC code> pourrait être dangereux. Guido lui-même doute que vous pourriez écrire une telle fonction. Voir code.google.com/p/googleAppengine/issues/detail?id = 671 . JSON est plus simple que Python, et j'ai plus de confiance qu'un analyseur JSON ne serait pas vulnérable de la manière dont
eval code> peut être.
JSON est la meilleure solution ici, mais pour le compte rendu, vous pouvez écrire une évaluation sûre qui désérialisera des dictes de valeurs primitives en toute sécurité.
JSON nécessite des frais généraux pour certaines propriétés. Par exemple, vous ne pouvez pas simplement utiliser JSON pour sérialiser les valeurs DateTimeProperty.
Je suis à peu près sûr qu'il n'y a aucun moyen de stocker un dictionnaire Python. Mais pourquoi ne pas simplement placer ce que vous aimeriez au houblon comme deuxième modèle? P>
Aussi, comme mentionné John, vous pouvez utiliser Pickle, mais (et me corriger si je me trompe) le stocke comme un Blob à la place. P>
@Bartek, vous pouvez utiliser les décharges et charges du module de cornichon pour fonctionner avec des chaînes: >>> cpickle.loads (cpickle.dumps ({1: "One"})) {1: "One '}
Vos options sont essentiellement pour utiliser le cornichon, pour utiliser un db.expando et faire chaque clé dans la propriété DICT une propriété distincte, ou pour avoir une source de protection des clés et une des valeurs et de la fermeture zip vers une dicte lors de la lecture . p>
Vous pouvez utiliser JSON P>
@gnibbler: convertir le dict code> dans le format JSON et stockez-le sous forme de
db.stringproperty code>?
@Kit, oui. En plus d'être plus sûr que RECER / EVAL et vous permet d'écrire un "SAFY EVAL", JSON est plus portable si vous vous trouvez en utilisant une langue différente à un moment donné
Je l'ai fait comme ceci:
class MyEntity(db.Model): dictionary_string = db.StringProperty() payload = {{}...{}} # Store dict my_entity = MyEntity(key_name=your_key_here) my_entity.dictionary_string = str(payload) my_entity.put() # Get dict import ast my_entity_k = db.Key.from_path('MyEntity', your_key_here) my_entity = db.get(my_entity_k) payload = ast.literal_eval(my_entity.dictionary_string)
Je suis surpris que ce n'est pas plus élevé. Je suis à peu près sûr que JsonProperty est exactement ce que quelqu'un dans la position de Pop recherche.