【问题标题】:Loop delete rows based on Count and * of days根据 Count 和 * of days 循环删除行
【发布时间】:2018-12-06 17:02:49
【问题描述】:

我正在尝试根据 Count 和 * of days 删除 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 循环的方法,它会增加 Count 和 * 天

我试过了:

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))

我在days = row[7] 下得到一个IndexError: tuple index out of range

我查了error,改了号码看看能不能解决,还是indexerror。

结果表的样本数据如下所示:“select * from result;”从 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 的任何建议?谢谢!

【问题讨论】:

  • 看起来你在 for 循环的每次迭代中都分配了相同的东西。
  • 我不明白你的第二个示例代码——它执行一个 SELECT,然后在循环中执行另一个 SELECT——它从不尝试删除,这就是你所说的你想要的。
  • 请修复cursor.fetchall,因为它不接收参数。

标签: python python-3.x sqlite


【解决方案1】:

考虑参数化整个间隔日期,'-7 day''-14 day',...因为不应引用 qmark 占位符。然后,将构建的字符串传递给.execute() call:

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()

【讨论】:

  • 谢谢!所以 Count 增加 0,1, 2, 3,... 等等,还有天数?抱歉,我是 python 新手:/ 代码在 'days = '-{} day'.format(row[7])' 处输出 'IndexError: tuple index out of range' 我正在寻找解决方案,不胜感激帮助!
  • Count 不会增加,而是使用 SELECT * FROM ... 查询中的第一列,同样,日期值将来自同一查询的第 8 列。请发布此结果的几行以查看循环获取的内容。
  • 感谢您的回复!我在大学兼职,所以我的回复可能会迟到。好的,我收到一个索引错误,因此无法从脚本中获得结果。我的选择语句是"SELECT * FROM result;" 我还需要增加计数,所以我输入了Count = i[1]。我正在尝试根据我在问题中发布的第一个命令中所述的计数和天数删除行。还在调查这个。感谢您的帮助!
  • 请使用minimal reproducible exampleresult表的示例数据编辑您的帖子。
  • @acb452:你必须使用Count = i[2]days = '-{} day'.format(i[1])
【解决方案2】:

问题:我正在尝试找到一种使用 for 循环的方法,它会增加 Count 和 * 天数

递增Countdays

    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 测试

【讨论】:

    猜你喜欢
    • 2020-06-24
    • 1970-01-01
    • 2020-01-05
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 2016-04-25
    • 1970-01-01
    相关资源
    最近更新 更多