2016-08-03 9 views
0

アクティビティの交換を変更し、そのアクティビティをデータベースに保存し直したいと思います。
some_act['name'] = "some new name"
し、その後でアクティビティを保存します:
それは、その名のように、活動の他の側面を変更することが可能である some_act.save()
交流を同じ方法で変更することも可能である:
some_exc['scale"] = 0.5
をし、
some_exc.save()Brightway2:アクティビティをdictとしてアクティビティを使用せずに変更/削除する

しかし、私は特定の活動から交流を追加/削除することが分かってきた唯一の方法は、を通過することです。それからとの交流を保存活動の:

some_act_dataset = some_act._data 
some_act_dataset['exchanges'] = [{exchange1}, {exchange2}] # exc must be valid exchange dict 

問題は、私は戻ってデータベースに(dictのような)新しいアクティビティを保存する方法がわからないということです。
some_act_dataset.save()辞書にはsaveメソッドがないため、機能しません。 Database("my_database").write(some_act_dataset)は、データベース内の他のすべてのデータを上書きします。

私がロードされたデータベースで作業することができます:
loaded_db = Database("my_database").load()
と私は結果の辞書に必要な変更を行い、その後、データベース全体を書きますが、データベースが大きいのとき、これはコストのかかる操作のように思えます。

質問:アクティビティの交換を変更し、データベース全体を上書きすることなくアクティビティをデータベースに保存する方法はありますか?

答えて

1

アクティビティとエクスチェンジは、SQLiteデータベースの別々のテーブルに格納され、それぞれ独自のオブジェクトを持っています。データベースからの旅では、いくつかの翻訳層が使用されます。

Brightway2 Activity object hierarchy

しかし、我々はほとんど常にActivityExchangeオブジェクトを操作します。重要なのは、アクティビティとエクスチェンジは2つの別々のテーブルであるため、別々に処理する必要があるということです。

Activity.new_exchange()を使用し、新しい交流を作成するには:

In [1] from brightway2 import * 

In [2]: act = Database("something").random() 

In [3]: exc = act.new_exchange() 

In [4]: type(exc) 
Out[4]: bw2data.backends.peewee.proxies.Exchange 

また、データがnew_exchangeメソッド呼び出しで属性を指定することができます。

In [5]: exc = act.new_exchange(amount=1) 

In [6]: exc['amount'] 
Out[6]: 1 

Exchangeを削除するには、Exchange.delete()を呼び出します。多くのデータ操作を行っている場合は、データベースに対してSQLを直接実行するか、またはActivityDatasetまたはExchangeDatasetというピーピークエリを書くことができます(たとえば、Exchangesオブジェクトの構築で作成されたクエリを参照してください)。

関連する問題