Brightway2:修改/删除活动中的交换而不使用活动作为dict

时间:2016-08-03 02:25:32

标签: brightway

我想修改活动的交换并将活动保存回数据库 可以更改活动的其他方面,例如其名称:
some_act['name'] = "some new name"
然后使用以下命令保存活动: some_act.save()
也可以用同样的方式修改交换:
some_exc['scale"] = 0.5
然后用以下方式保存交换:
some_exc.save()

但是,我发现添加/删除特定活动的交换的唯一方法是浏览活动的dictionary version

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 个答案:

答案 0 :(得分:1)

Actiities和交换存储在SQLite数据库的单独表中,它们每个都有自己的对象。在往返数据库的过程中,使用了几个转换层:

Brightway2 Activity object hierarchy

但是,我们几乎总是使用ActivityExchange个对象。这里的关键点是,因为活动和交换是两个独立的表,所以必须单独处理它们。

要创建新的兑换,请使用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,或者使用ActivityDatasetExchangeDataset编写peewee查询(请参阅构建{{1}中构建的查询对象)。