簡體   English   中英

如何擁有一個跟蹤數據庫更改的外部腳本?

[英]How can I have an external script that tracks changes in database?

我正在使用 Django 並且有一個帶有單個按鈕的骨架網站,該按鈕在我的數據庫中遞增 IntegerField。 我想要一個外部腳本,它不斷地讀取這個 IntegerField 並在發生更改時報告。

模型.py

class Counter(models.Model):
    count = models.PositiveIntegerField(default=0)

視圖.py

def index(request):
    ctr = Counter.objects.get(id=1)
    pre = ctr.count
    print(f"pre: {pre}")

    if request.method == 'POST':
        if request.POST.get("increment"):
            Counter.objects.filter(id=1).update(count=F('count') + 1)
            post = ctr.count
            print(f"pre: {pre}")


return render(request, 'increment.html')

我想我可以簡單地在視圖 function 中實現這一點,但我很難檢測到變化,因為當我打印它們時,上面的 pre 和 post 值是相同的,即使 post 是在字段增加后明確創建的。

我的應用程序目錄中有一個 watcher.py 文件,我試圖在其中編寫一個腳本,該腳本將在后台運行並報告對數據庫的更改。 這是我到目前為止所擁有的:

from django.conf import settings

settings.configure(DEBUG=True)

import django
django.setup()

import models
import time
from ahelper import settings
from threading import Thread


def watcher():
    ctr = models.Counter.objects.get(id=1)
    pre = ctr.count
    print(f"{pre}")
    print("start loop")
    while (1):
        temp = time.time()
        post = ctr.count
        if pre != post:
            print("Change detected")
            response_time = (time.time() - temp) * 1000
            print(f"{response_time}ms")

t = Thread(target=watcher, daemon=True)
t.start()

當我嘗試運行它時,我收到錯誤: Model class models.Counter 沒有聲明明確的 app_label 並且不在 INSTALLED_APPS 的應用程序中 我不明白為什么會出現這種情況,也不知道如何解決; 我不認為讓 Counter 成為自己的應用程序是合適的。

在這一點上我非常迷茫,所以任何幫助表示贊賞。 我會以正確的方式解決這個問題嗎? 有沒有更簡單的方法來做到這一點?

您必須在 django 應用程序中運行此腳本。 這可以以不同的方式完成,但更簡單的方法是使用 Django 的前/后保存信號,因此您知道何時修改此字段: https://docs.djangoproject.com/en/4.1/參考/信號/#django.db.models.signals.post_save

如果您仍想使用專用運行器,您可以創建一個在 Django 旁邊運行的線程/進程。 您的代碼中仍然存在一個問題,

post = ctr.count

這不會從數據庫重新加載 object state。 您需要手動重新加載 object 以確保它是最新的。 其他方式您不會檢測到任何更改:

ctr.refresh_from_db()
post = ctr.count

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM