Как избежать добавления строк в SQLAlchemy, если значение не изменилось с момента последней записи? - PullRequest
1 голос
/ 16 февраля 2012

Я собираюсь отслеживать эволюцию некоторых значений в базе данных с помощью 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.

Есть ли лучший способ сделать это?«Лучшее» не обязательно означает «быстрее», может быть просто более питонным или лучше выглядящим кодом.

1 Ответ

1 голос
/ 05 мая 2012

Я знаю два способа сделать это.Вот ваш подход:

if value not in database:
    session.add(value)
session.commit()

или

try:
    session.add(value)
    session.commit()
except IntegrityError:
    session.rollback()

Первый имеет состояние гонкиЯ склонен использовать второй шаблон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...