Цикл удаления строк на основе количества и * дней - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь удалить строки в SQLite на основе количества и * дней.

Вместо того, чтобы писать несколько команд SQL, как это:

DELETE * FROM result WHERE Count = 1 AND ("min(_time)" < strftime('%s','now', '-7 day'));
DELETE * FROM result WHERE Count = 2 AND ("min(_time)" < strftime('%s','now', '-14 day'))
DELETE * FROM result WHERE Count = 3 AND ("min(_time)" < strftime('%s','now', '-28 day'));

и так далее ...

Я пытаюсь найти способ использовать цикл for, где он увеличивает счетчик и число * дней

Я пытался это сделать:

data = c1.execute('''SELECT * FROM result;''')

for row in data:
    Count = row[1]
    days = row[7]
    c1.execute('''DELETE * FROM result WHERE Count = ? AND ("min(_time)" < strftime('%s','now', '-? day'));''', (Count, days))

Я получаю IndexError: tuple index out of rangeпод days = row[7].

Я посмотрел ошибка и изменил число, посмотрим, исправит ли это, все еще indexerror.

Пример данных таблицы результатов выглядит следующим образом: "select *из результата; "Столбцы, экспортированные из Splunk: src_ip, 'min (_time)', Count

183.78.180.27|1542266993|1
185.189.150.42|1542246169|1
185.189.150.61|1542271436|1
2002:8672:d515::8672:d515|1537536602|3
150.135.165.114|1537288499|3

Правильно ли я понимаю концепцию сценария?Любые предложения по indexerror?Спасибо!

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Вопрос : я пытаюсь найти способ использовать цикл, где он увеличивает число и * дней

Увеличение Count и days:

    day = -7        
    for count in range(1, 4):
        print("WHERE Count = {} AND '{} day')".format(count, day))
        day = day * 2

Вывод :
Примечание : Это не готово для использования в операторе SQL!

WHERE Count = 1 AND '-7 day')
WHERE Count = 2 AND '-14 day')
WHERE Count = 3 AND '-28 day')

Протестировано на Python: 3,5,3

0 голосов
/ 21 ноября 2018

Рассмотрите возможность параметризации всей даты интервала, '-7 day', '-14 day', ..., поскольку заполнители qmark не должны заключаться в кавычки.Затем передайте встроенную строку в .execute() вызов:

delete_sql = '''DELETE FROM result 
                WHERE [Count] = ? 
                AND ("min(_time)" < strftime('%s', 'now', ?));
             '''

data = c1.execute("SELECT * FROM ...")

for i in data.fetchall():
    Count = i[0]
    days = '-{} day'.format(i[7])

    c1.execute(delete_sql, (Count, days))
    conn.commit()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...