如何自动删除数据库中的expires数据?

时间:2017-08-18 10:49:34

标签: django

如果我将行数据存储在数据库表(instance)中,并且该表具有字段名expire_time。如果时间超过expire_time,我想删除行数据。

所以,如果我想这样做,我每次都可以查询表,遍历每一行数据,如果过期,则删除。

但如果我不查询,我就无法实现这一要求。

那么,如果有方法可以做到这一点?

我使用的是python django,数据库是mariadb。

3 个答案:

答案 0 :(得分:1)

我不确定你的意思是:

  

我无法实现这一要求。

但我认为您可能需要考虑:

  • custom manage.py命令,用你的venv python源命令cron这个命令
  • 添加django-cron以定期检查过期数据并将其删除
  • 尝试celery作为cron的另一个解决方案,但它可能会因你的情况而过于复杂
  • 添加event to MariaDB并安排定期

自定义manage.py cmd和事件的缺点是,如果迁移服务器,则应该记住添加新的cron作业/事件以定期清理db。

答案 1 :(得分:1)

您可以写一个custom management command来为您执行此操作。将其保存在myapp/management/commands/delete_expired.py中,例如:

from django.core.management.base import BaseCommand
from django.utils import timezone
from myapp.models import MyModel


class Command(BaseCommand):
    help = 'Deletes expired rows'

    def handle(self, *args, **options):
        now = timezone.now()
        MyModel.objects.filter(expire_time__lt=now).delete()

然后从cron任务或队列中调用该命令。要在命令行上执行此操作,您可以调用:

python manage.py delete_expired

答案 2 :(得分:0)

我不知道这样做的数据库级方法(如果您正在寻找特定于数据库的解决方案,可能需要添加mariadb标记。)

在应用程序级别,我想到了一种方法。您可以使用Celery,并且无论何时存储行数据,都可以安排任务删除它。芹菜任务应检查expire_time是否实际无效(该字段是否可以修改或更新?)。

您还可以(另外或作为替代方案)拥有Celery beat作业,该作业定期获取具有较小expire_time的元素。如果它应该删除,删除并再次调用自己。否则,等待下一拍。