Рассмотрите возможность перефакторинга вашего кода по нескольким причинам:
try/except
обычно используется для обработки исключений и ошибок времени выполнения, а не для логики приложения.Используйте if/else
для этих ситуаций.
Удалите ненужный цикл for
, так как вы не удаляете строку за строкой, поскольку в операторы DELETE
не передается уникальный идентификатор.В действительности вы выполняете процесс удаления по всей таблице, если логика передает текущую строку, не отфильтрованную, в эту строку.
Используйте чистый SQL с одним оператором DELETE
и избегайтеОбработка Python элементов времени, которая, как вы видите, поддерживает проблемы конвертации из базы данных.MS Access SQL имеет функции даты, такие как Date()
(текущая дата) и DatePart()
для извлечения месяца / дня.Кроме того, MS Access может выполнять сложную логику подзапроса в DELETE
.
SQL
с использованием подзапроса IN
для обоих условий даты.ПРИМЕЧАНИЕ: ID
следует заменить уникальным идентификатором таблицы.Проверьте SELECT
версию запроса до DELETE
версии.
DELETE FROM RELEASES r
WHERE r.ID IN
(SELECT sub.ID
FROM RELEASES sub
WHERE sub.RELEASED_BY = ?
AND (
(
DatePart('m', sub.RELEASED_DATE) = DatePart('m', Date()) - 1
AND DatePart('yyyy', sub.RELEASED_DATE) = DatePart('yyyy', Date())
AND DatePart('d', sub.RELEASED_DATE) = 1
)
OR
(
DatePart('m', sub.RELEASED_DATE) = DatePart('m', Date())
AND DatePart('yyyy', sub.RELEASED_DATE) = DatePart('yyyy', Date())
AND DatePart('d', sub.RELEASED_DATE) > 1
)
)
)
Python
Передача параметров с датами, обрабатываемыми в движке Access.
conn = pyodbc.connect(r'...')
insights_dbcurs = conn.cursor()
sql = """DELETE FROM RELEASES r
WHERE r.ID IN
(SELECT sub.ID
FROM RELEASES sub
WHERE sub.RELEASED_BY = ?
AND (
(
DatePart('m', sub.RELEASED_DATE) = DatePart('m', Date()) - 1
AND DatePart('yyyy', sub.RELEASED_DATE) = DatePart('yyyy', Date())
AND DatePart('d', sub.RELEASED_DATE) = 1
)
OR
(
DatePart('m', sub.RELEASED_DATE) = DatePart('m', Date())
AND DatePart('yyyy', sub.RELEASED_DATE) = DatePart('yyyy', Date())
AND DatePart('d', sub.RELEASED_DATE) > 1
)
)
)"""
insights_dbcurs.execute(sql, ('27',))
conn.commit()
conn.close()