Я собираюсь отслеживать эволюцию некоторых значений в базе данных с помощью SQLAlchemy: я получаю их в виде последовательности пар (ключ, значение) и ожидаю, что значения для каждого ключа будут меняться редко.
Я использую SQLAlchemy с декларативным , модель выглядит следующим образом:
class Item(Base):
timestamp = Column(DateTime)
key = Column(Unicode(16))
value = Column(something...)
Я хотел бы хранить такие строки, как (метка времени, ключ, значение)в базе данных и избегайте хранения новых записей, если значение не изменилось с момента последней записи, сохраняя при этом всю историю прошлых значений.В псевдо-питоне:
for foo in new_items:
query = session.query(Item).filter_by(key=foo.key)
latest = query.order_by(Item.timestamp.desc()).first()
if foo.value == latest.value:
continue # nothing changed, ignore the new item
else:
session.add(foo)
session.commit()
Должен ли я придерживаться наивного подхода, подобного приведенному выше?Это как-то кажется мне не очень привлекательным кодом.По крайней мере, я бы добавил тест в качестве метода для Item.
Есть ли лучший способ сделать это?«Лучшее» не обязательно означает «быстрее», может быть просто более питонным или лучше выглядящим кодом.