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)

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?

  • Mysqldb zieht ganze Abfrage Ergebnis in einem Stück immer auch wenn ich nur einen Fetchone machen?
  • Integrieren von MySQL mit Python in Windows
  • Dynamische Einstellung __tablename__ für sharding in SQLAlchemy?
  • Wie erstelle ich eine CSV-Datei aus der Datenbank in Python?
  • Kann ich die GROUP BY in django 1.3's orm kontrollieren?
  • Drucken Sie die eigentliche Abfrage MySQLdb läuft?
  • Wie man mehrere Schichten von verschachtelten json in sql Tabelle umwandelt
  • Python-MySQL (mit pymysql) Auto-Reconnect
  • 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.