Brightway2: изменение / удаление бирж из активности без использования активности в качестве диктата

Я хотел бы изменить биржи активности и сохранить активность обратно в базу данных.
Можно изменить другие аспекты деятельности, например, ее название:
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 ответ

Решение

Действия и обмены хранятся в отдельных таблицах в базе данных SQLite, и у каждого из них есть свой собственный объект. В пути к базе данных и из нее используются несколько уровней перевода:

Brightway2 Иерархия объектов деятельности

Тем не менее, мы почти всегда работаем с Activity или же Exchange объекты. Ключевым моментом здесь является то, что поскольку действия и обмены представляют собой две отдельные таблицы, они должны рассматриваться отдельно.

Чтобы создать новый обмен, используйте 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 непосредственно для базы данных, либо написать запросы на peewee с ActivityDataset или же ExchangeDataset (см., например, запросы, построенные в конструкции Exchanges объект).

Другие вопросы по тегам