Мой подход к тому, чтобы избежать нескольких записей базы данных flask-sqlalchemy

Приложение My Flask читает CSV-файл журнала наблюдений, основанный на времени, к которому добавляются новые записи. Мой подход, направленный на избежание дублирования, заключается в сборе переменных и тестировании перед добавлением записи, как в:

        sl = db.session.query(DesignObservation).filter_by(worker_id = worker_id).filter_by(design_id = design_id).filter_by(ob_date = ob_date)

        if len(sl.all()):
            pass
        else:
            db.session.add(observation_record)
            db.session.commit()

Не уверен, почему этот шаблон не добавляет запись. Если я откажусь от теста, запись будет добавлена, но при последующих запусках будут добавлены дубликаты.

0
0
39
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы должны установить ограничения UNIQUE для таблицы, в которую вы пишете. Затем механизм базы данных будет управлять уникальностью за вас.

Вам придется иметь дело с исключением UNIQUE constraint failed, которое появляется на вашем пути ...

Я не могу изменить модель данных, чтобы установить ограничения UNIQUE для нескольких полей. Требовалось придумать альтернативный подход.

Timothy Lombard 12.08.2018 00:35

Я нашел эту запись SO полезной - stackoverflow.com/questions/43975349/…

Timothy Lombard 13.08.2018 04:48
Ответ принят как подходящий

Что я в итоге сделал, так это связал design_id с ob_date, чтобы определить уникальность, а затем проверил с помощью функции ниже, чтобы вернуть логическое значение уникальности добавляемой записи.

import parser.parse as date_parse

def check_4_obs_dups(design_id, ob_date):
    # returns bool
    r = DesignObservation.query.filter_by(design_id=design_id).all()
    # convert date strings stored in SQLite to datetime 
    s = [date_parse(x.ob_date) for x in r]

    return date_parse(ob_date) in s

Затем, перебирая каждую строку файла CSV, я проверяю уникальность с помощью этого цикла:

if not check_4_obs_dups(design_id, ob_date):
    db.session.add(observation_record 

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