1

Google の BigTable データストアに保存したい Python 辞書があります (これはdb.Modelクラスの属性です)。

これを行う簡単な方法はありますか?つまり、db.DictionaryProperty? または、辞書をシリアル化するために pickle を使用する必要がありますか? 私の辞書は比較的単純です。キーとして文字列で構成されますが、一部のキーのサブディクショナリも含まれる場合があります。例えば:

{ 
    'myKey' : 100,
    'another' : 'aha',
    'a sub dictionary' : { 'a': 1, 'b':2 }
}

PS: 可能であれば、テキストではなくバイナリとしてシリアライズしたいと思います。

4

3 に答える 3

8

別のアプローチは次のとおりです。

class DictProperty(db.Property):
  data_type = dict

  def get_value_for_datastore(self, model_instance):
    value = super(DictProperty, self).get_value_for_datastore(model_instance)
    return db.Blob(pickle.dumps(value))

  def make_value_from_datastore(self, value):
    if value is None:
      return dict()
    return pickle.loads(value)

  def default_value(self):
    if self.default is None:
      return dict()
    else:
      return super(DictProperty, self).default_value().copy()

  def validate(self, value):
    if not isinstance(value, dict):
      raise db.BadValueError('Property %s needs to be convertible '
                             'to a dict instance (%s) of class dict' % (self.name, value))
    return super(DictProperty, self).validate(value)

  def empty(self, value):
    return value is None
于 2009-12-23T16:50:42.957 に答える
1

口述に到達できるようにする必要があるときは、一気にですか?データストアにある間、辞書内から値を取得する必要はありませんか?

その場合、シリアル化する必要がありますが、ピクルを使用する必要はありません。代わりに simplejson を使用します。次に、取得は toBasicType() をオーバーライドする単純な問題です。次のようなものです。

class MyModel(db.Model): #大きな dict を含む TextProperty である「data」を含むいくつかのプロパティを定義する def toBasicType(self): return {'metadata': self.getMetadata(), 'data': simplejson.loads (self.data)}

作成には MyModel(...,simplejson.dumps(data),...) の呼び出しが含まれます。

すでに酸洗を行っている場合は、それが最善の策かもしれませんが、simplejson はかなりうまく機能しています。

于 2009-12-23T19:28:21.810 に答える
1

オブジェクトのシリアル化を避けることはできないと思います。

各キーと値のペアを格納するために、次のモデルを定義します。

class DictModel(db.Model):
    value = db.TextProperty()

私が使用するデータストアに保存するには:

def set_value(key, value):
    key = DictModel(value=pickle.dumps(value), key_name=key)
    key.save()
    return key

データを取得するには:

def get_value(key):
    return pickle.loads(DictModel.get_by_key_name(key).value)
于 2009-12-23T16:40:19.423 に答える