2016-08-08 6 views
0

Hier ist meine Modelle und Ansichten Datei. Mein Ziel war es, meiner Datenbank ("Entries") ein neues Attribut hinzuzufügen, das ich meinen Modellen hinzugefügt habe, und die Migrationen mit den Befehlen von python manage.py vorzunehmen. Das hat funktioniert und alles hat das neue Attribut mit dem korrekten Standard "NA" drin. Ich wollte dann eine Datei lesen und diese Spalte verwenden, um die Datenbank mit den richtigen Werten zu aktualisieren. Es "funktionierte" mit der Ausnahme, dass nachdem der Befehl .save() ausgeführt wurde, er die Datenbank korrekt aktualisierte, aber immer noch meinen Ausnahmefehler und den try-Block verließ. SucheWenn Django save() zum Aktualisieren von db verwendet wird, wird eine Ausnahme ausgelöst, aber warum wird db noch aktualisiert?

Ich habe versucht zu sehen, ob jemand anderes das gleiche Problem hatte und lesen Website durch die Dokumentation auf Djangos über save() [https://docs.djangoproject.com/en/1.9/topics/db/models/]

Ich habe mich gefragt, warum und ob jemand dieses Problem gehabt hat und sagen kann, Ich, was in der Zukunft zu tun, um dieses Problem zu beheben.

Die Art, wie ich weiß, dass meine Datenbank aktualisiert wurde, war danach habe ich eine "Data.objects.all()" ausgeführt und auf jedem die "Sonden" und "Einträge" ausgedruckt, um zu sehen, dass sie alle von NA zu was geändert haben meine Akte war.

Danke für jede Hilfe.

models.py

class Data(models.Model): 
    Probes = models.CharField(primary_key=True, max_length=50) 
    Entries = models.CharField(max_length=25, default="NA") 
    Symbol = models.CharField(max_length=50) 
    Pattern = models.CharField(max_length=25) 
    Day1 = models.FloatField() 
    Day3 = models.FloatField() 

    class Meta: 
     unique_together = (('Probes', 'Symbol', 'Pattern'),) 

views.py

def testUpdateDB(passFileName): 

f = open(passFileName, 'r') 

for Line in f: 
    Line = Line.replace('\r',"") 
    Line = Line.replace('\n', "") 

    row = Line.split(",") 

    AryList = {"Probes": row[0], 
       "Entries":row[2], 
       "Symbol": row[3], 
       "Pattern":row[4], 
       "Day1": row[5], 
       "Day3": row[6] 
       } 
    try: 
     # Update the database 
     t = Data.objects.get(Probes=AryList["Probes"]) 

     print(t.Probes + " has " + t.Entries + " for its entries, updating to " + AryList["Entries"]) 

     t.Entries = AryList["Entries"] 
     t.save() 

     u = Data.objects.get(Probes=AryList["Probes"]) 

     print(u.Probes + " has " + u.Entries + " for its entries now. Update was sussess!") 

    except: 
     print("Could not find: " + AryList["Probes"]) 

In meinem views.py direkt nach/während der "t.save()" springt das Programm auf den Ausnahmeblock und Drucke diese Nachricht aus. Danach kann ich mir die DB ansehen und sehen, dass alles korrekt aktualisiert wurde, aber warum ist dann die Ausnahme passiert? Auch warum hat der gesamte try block nicht fertig? Jeder andere hat diesen Fehler, wenn er versucht, seine Datenbank zu aktualisieren.

+0

Warum bringst du 'du'? Sie haben das Objekt bereits in 't' – patito

+1

** Nie, niemals ** ein leeres' except' machen. Sie haben sechs Zeilen innerhalb des try-Blocks, und die Ausnahme könnte von jedem von ihnen verursacht werden; die Wahrscheinlichkeit ist hier, dass Sie einen anderen (wahrscheinlich trivialen) Fehler haben. Wenn Sie nur die Ausnahme abfangen wollen, wenn die Daten nicht existieren, fangen Sie nur folgendes ab: 'außer Data.DoesNotExist:'. –

+0

Patito, als ich debugging dachte ich, dass es das t war, also habe ich versucht, das Abfrageergebnis einer neuen var zuzuordnen, und habe es nie wieder geändert. –

Antwort

0

Versuchen Sie, transaction.atomic() zu verwenden, wenn irgendein Fehler auftritt, wird der gesamte im Block vorhandene Code zurückgesetzt. Nichts wird gespeichert, wenn nicht der gesamte Block ausgeführt wird.

Es ist gut dokumentiert mit Beispielen in Verbindung oben, versuchen Sie, alle save() in atomaren Transaktion zu verwenden.

+1

stellen Sie sicher, dass Sie '' 'ATOMIC_REQUESTS = True'' in Ihren Einstellungen setzen, wenn Sie transaction.atomic() verwenden –

+0

@luke_aus' ATOMIC_REQUESTS' macht genau das Gleiche wie 'transaction.atomic()', warum würden Sie es brauchen, wenn Sie bieten eine detailliertere Transaktionssteuerung mit "atomic()" bereits? – knbk

0

Der Header-Datensatz verursachte das Problem. Sobald der erste Datensatz der Datei verworfen wurde, hat alles super funktioniert.

Hier ist die aktualisierte Views.py für die Unterstützung aus

views.py

def testUpdateDB(passFileName): 

    f = open(passFileName, 'r') 

    discardHeader = f.readline() # New line which removes header record 

    for Line in f: 
     # Everything else stay the same as before # 

Dank jeder Datei.

Verwandte Themen