如果我将行数据存储在数据库表(instance
)中,并且该表具有字段名expire_time
。如果时间超过expire_time
,我想删除行数据。
所以,如果我想这样做,我每次都可以查询表,遍历每一行数据,如果过期,则删除。
但如果我不查询,我就无法实现这一要求。
那么,如果有方法可以做到这一点?
我使用的是python django,数据库是mariadb。
答案 0 :(得分:1)
我不确定你的意思是:
我无法实现这一要求。
但我认为您可能需要考虑:
自定义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的元素。如果它应该删除,删除并再次调用自己。否则,等待下一拍。