2016-08-03 1 views
0

Я хотел бы изменить обмены действиями и сохранить активность обратно в базу данных.
Можно изменить другие аспекты деятельности, как и его название:
some_act['name'] = "some new name"
, а затем сохранить активность с: some_act.save()
Также можно изменить обмены таким же образом:
some_exc['scale"] = 0.5
и затем сохранить обмен с:
some_exc.save()Brightway2: Изменение/удаление обменов из активности без использования активности как dict

Однако, единственный способ, которым я нашел, чтобы добавить/удалить обмены с определенной деятельности, чтобы пройти через 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()
и внести изменения, мне нужно в результирующем словаре, а затем записать всю базу данных, но когда базы данных являются большими, это похоже на дорогостоящую операцию.

Итак, вопрос в том, есть ли способ изменить обмен активности и сохранить активность обратно в базу данных без необходимости переписывать всю базу данных?

ответ

1

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

Brightway2 Activity object hierarchy

Однако, мы почти всегда работаем с 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).

 Смежные вопросы

  • Нет связанных вопросов^_^