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






Добавьте УНИКАЛЬНЫЙ ИНДЕКС в таблицу, в которую вы вставляете записи:
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. Гораздо проще и надежнее реализовать это на уровне базы данных, чем последовательно кодировать на уровне приложения.