Как добавить только те записи, которые еще не добавлены в базу данных

Я использую PostgreSQL. У меня есть следующий код:

vehicles = get_vehicle_references()
for vehicle in vehicles:
    insert_into_db(vehicle[0], vehicle[1])

А get_vehicle_references() выглядит следующим образом:

def get_vehicle_references():
    conn = db_connection()
    cur = conn.cursor()
    try:
        s = "SELECT reference, reference_url FROM vehicles v WHERE NOT EXISTS (select reference from daily_run_vehicle rv WHERE handled = %s AND retries < %s  AND rv.timestamp::timestamp::date = %s AND v.reference=reference) ORDER BY id DESC"
        cur.execute(s, (False, 5, today))
        return cur.fetchall()
    except Exception as e:
        capture_error(str(e))
    conn.close()

Таким образом, запрос в этой функции выглядит следующим образом:

SELECT reference, reference_url
FROM vehicles v
WHERE NOT EXISTS
    (select reference from daily_run_vehicle rv
     WHERE handled = False
         AND retries < 5
         AND rv.timestamp::timestamp::date = str(date.today())
         AND v.reference=reference)
ORDER BY id DESC

Я получаю reference и reference_url, а затем вставляю их в базу данных.

Я повторяю это более 500 раз каждый день. Я хочу следующее:

  • Когда он выполняется в первый раз, если reference из vehicles в daily_run_vehicle имеет поле handled = False и retries < 5, я хочу вставить этот reference в базу данных.

  • Когда в тот же день он снова перейдет к этому запросу, я хочу проверить, reference в daily_run_vehicle имеет поле handled = False, а retries < 5 уже добавлен в таблицу daily_run_vehicle в тот день. Если он уже добавлен, я хочу пропустить эту запись.

Я потерялся здесь. Может ли кто-нибудь помочь мне, пожалуйста.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
37
1

Ответы 1

Добавьте УНИКАЛЬНЫЙ ИНДЕКС в таблицу, в которую вы вставляете записи:

CREATE UNIQUE INDEX yourtable_idx on yourtable (date, reference, reference_url);

Обратите внимание, что date является частью уникального индекса. Таким образом, каждый уникальный кортеж (date, reference, reference_url) может быть вставлен только один раз.

Затем вы можете вставлять записи в yourtable с помощью SQL:

INSERT INTO table (date, reference, reference_url)
VALUES (%s, %s, %s)
ON CONFLICT (date, reference, reference_url) DO NOTHING

Предложение ON CONFLICT ... DO NOTHING указывает Postgresql игнорировать вставку, если Кортеж (date, reference, reference_url) уже находится в yourtable.

После того, как вы настроили свою таблицу Postgresql с уникальным индексом, вы можете безнаказанно выполнять вставку и не беспокоиться о создании дубликатов в коде Python. Гораздо проще и надежнее реализовать это на уровне базы данных, чем последовательно кодировать на уровне приложения.

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