Django-ORM-Abfragen können keine neuen Objekte auswählen

Konfiguration:

  • Python-Skript A fügt Daten in eine DB alle 15 Minuten ein
  • Python-Skript B Abfragen für die letzten 5 Einträge alle paar Minuten

Beide verwenden djangos ORM, das gleiche MySQL DB und das gleiche DB Benutzerkonto (gleiche settings.py Datei)

  • Django Transaction verwalteter Block endete mit ausstehendem COMMIT / ROLLBACK
  • Django selbstreferentieller Fremdschlüssel
  • Wie kann ich ODER Zustand in django queryset durchführen?
  • Django: Summe auf ein Datumsattribut gruppiert nach Monat / Jahr
  • Django asymmetrische Selbst durch Beziehungsabfrage
  • Django-Filter auf TimeField
  • Das Problem:
    B ist in der Lage, nur eingefügte Einträge zu holen, bevor es ausgeführt wurde. Als ob B mit einer gefrorenen DB läuft, gefroren im Moment B zuerst mit der DB verbunden.

    Woher?
    Kann ich dieses Verhalten in django kontrollieren?

  • Reverse Repräsentative Funktion in Python
  • Ausgabedifferenz zwischen ipython und python
  • Beste Ausgabetyp und Codierung Praktiken für __repr __ () Funktionen?
  • Wie kann eine Stringdarstellung eines NumPy-Arrays in ein NumPy-Array konvertiert werden?
  • Wann ist die Ausgabe von repr nützlich?
  • Force repr () um einfache Anführungszeichen zu verwenden
  • 2 Solutions collect form web for “Django-ORM-Abfragen können keine neuen Objekte auswählen”

    Wenn du das gleiche Manager-Objekt wiederverwendest, musst du im Auge behalten, dass es Caching ist . Um damit zu handeln, musst du manuell aktualisieren.

    Dies führt bei jeder Iteration zu gleichen Ergebnissen:

     while True: same_every_time = AClass.objects.all().order_by('-id')[:5] sleep(300) 

    Um es richtig funktionieren zu lassen, musst du das Update hinzufügen:

     while True: AClass.objects.update() updated_results = AClass.objects.all().order_by('-id')[:5] sleep(300) 

    Django selbst verwendet eine Art Container-verwaltete Persistenz. Dies bedeutet, dass die Datenbank-Transaktionen von der Middleware während der Upstream-Response-Kaskade begangen werden.

    Wenn Sie usiong Django ORM von selbst sind, sollten Sie sicherstellen, tatsächliche Begehung der Transaktion:

     from django.db import transaction def my_task(whatever): MyModel.objects.create(...) # do whatever transaction.commit() return 'my_result' 
    Python ist die beste Programmiersprache der Welt.