8

Python辞書をデータストアに保存する良い方法はありますか?私は次のようなことをしたい:辞書をデータストアに配置するにはどうすればよいですか?

from google.appengine.ext import db 

class Recipe(db.Model): 
    name = db.StringProperty() 
    style = db.StringProperty() 
    yeast = db.StringProperty() 
    hops = db.ListofDictionariesProperty() 

もちろん、最後の行は実際には機能しません。私はキーと値のペアのリストであるためにホップが必要です。キーは常に文字列で、値は文字列、int、またはfloatになりますが、 Property classes

答えて

7

reprでdictをシリアライズするのは良い方法です。 evalで再構成するか、データを信頼しない場合は "safe eval"とします。

酸洗いの利点は、データがデータベース内で読み取り可能であり、必然的にクエリー可能であっても可能であることです。

+1

JSON、一般的にはevalよりも安全です。 –

+0

私はおそらくそのフィールドを照会する必要はありませんが、私はオプションがあるのが好きです。私が間違っている場合はまた、私を修正するが、reprを使用しないとJSONを使用してこの場合、同じ出力を持っていないだろうか? –

+0

「安全な評価」であっても、 'repr'は危険です。 Guido自身は、あなたがそのような機能を書くことができるかどうか疑問に思います。 http://code.google.com/p/googleappengine/issues/detail?id=671をご覧ください。 JSONはPythonよりも簡単です。私は、JSONパーサが 'eval'のできる方法で脆弱ではないという自信があります。 – lemnar

2

pickle辞書を使用して、それをStringPropertyとして格納できます。

2

私はPython辞書を格納する方法がないと確信しています。しかし、なぜあなたは2番目のモデルとしてホップで好きなものを置くだけではない?

また、ピックルを使うこともできますが、私が間違っていれば修正してください。代わりにBlobという値で保存してください。

+1

@Bartekでは、pickleモジュールのダンプとロード機能を使用して、文字列を扱うことができます。 >>> cPickle.loads(cPickle.dumps({1: "one"})) {1: 'one'} – Mark

1

基本的には、pick.lepandoを使用してdb.Expandoを使用し、dictの各キーを別のプロパティにするか、キーと値のいずれかをStringListPropertyにして、それらをdictに戻します読書あなたはJSON

7

私はこのようにそれをやった:

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) 
+0

+1:JSONルール。 –

+1

@gnibbler: 'dict'をJSON形式に変換し、' db.StringProperty'として保存しますか? – Kit

+0

@Kit、はい。 repr/evalよりも安全で、 "安全な評価"を書いていることを除けば、JSONはあなたがある段階で別の言語を使っていると分かります –

0

を使用することができます

関連する問題