1

我想修改活动的交换并将活动保存回数据库。
可以更改活动的其他方面,例如其名称:
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

问题是我不知道如何将新活动(作为字典)保存回数据库。
some_act_dataset.save()不起作用,因为字典没有save方法。 Database("my_database").write(some_act_dataset)覆盖数据库中的所有其他数据。

我可以在加载的数据库中工作:
loaded_db = Database("my_database").load()
并在结果字典中进行我需要的更改,然后编写整个数据库,但是当数据库很大时,这似乎是一个代价高昂的操作。

所以,问题是:有没有办法修改活动的交换并将活动保存回数据库而不需要覆盖整个数据库?

4

1 回答 1

2

活动和交换存储在 SQLite 数据库中的不同表中,并且它们每个都有自己的对象。在进出数据库的过程中,使用了几个翻译层:

Brightway2 Activity 对象层次结构

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

要创建新的交换,请使用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,或者使用 or 编写 peewee 查询ActivityDatasetExchangeDataset参见例如对象构造中的查询Exchanges)。

于 2016-08-04T07:45:01.290 回答