【问题标题】:Updating SQLite values periodically定期更新 SQLite 值
【发布时间】:2018-03-15 18:08:57
【问题描述】:

假设我有以下四条记录(假设还有更多):

        record 1      record 2      record 3         record 4

area    California    Texas         California       California

food    Lobster       Lamb          Rabbit           Bagels

popular Bagels        Elk           Rabbit           Rabbit

现在我通过手动选择areafood 将新记录添加到数据库中。然后通过在输入时为特定area 查找最常见的food 自动填充popular 字段。

例如,如果以上四个记录是整个数据库中的唯一记录,那么如果我要添加另一条记录 area: Californiafood: Bagels 然后 popular(对于我刚刚添加的记录)会自动分配值Bagels,因为food 字段中将有两个Bagels,用于区域California

以上已经可以使用了,我通过以下代码实现了以上功能:

popular = list(ModelData.objects.filter(area=area).values_list('food', flat=True))
Counter(popular).most_common()

问题是,以上操作仍然使数据库中的现有记录具有不正确的popular 值;因为popular 仅在输入时计算,而在添加更多条目时永远不会“重新计算”。

使用上面的示例(使用area: Californiafood: Bagels 添加新记录),仍然会有两个California 记录(record 3record 4)具有不正确的popular 值 -当Bagels 成为California 最受欢迎的新食物时,它们应该更新为Bagels

如何更新每个areapopular 值,使其成为新的、最受欢迎的food,只要它发生变化(或定期,即每小时/每天)?

我尝试过在线搜索,毫无疑问,没有任何运气,因为我意识到这是一个相当令人困惑的问题。

【问题讨论】:

  • cron 之类的东西可以定期运行更新。当关键信息发生变化时,celery 之类的东西可以排队请求重新计算热门页面。请记住,SQLite 一次只能运行一个更新事务,因此如果您的重新计算需要很长时间,届时您的数据库将变为有效的只读状态。
  • @9000 我使用schedule 库尝试过类似的操作,但是它使用while True 循环,所以我不明白当代码需要重复调​​用时如何使用它,但它不能,因为它陷入了无限循环。

标签: python sql django python-3.x sqlite


【解决方案1】:
  • 添加一个 URL 处理程序来执行您想要的内务管理。
  • 使该 URL 仅在内部可用(例如,需要令牌或检查请求者的 IP)。
  • 添加一个定期执行curl https://your-server/internal/run-houskeepingcron job(如man 5 crontab)。

【讨论】:

    【解决方案2】:

    我会使用 celery,这将帮助您安排更新并与 Django 很好地配合使用,或者您也可以将脚本添加到您的 crontab 中。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 2012-04-30
    • 1970-01-01
    • 2014-01-19
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多