Ich habe einen Endpunkt, um ein Objekt aus meiner Datenbank zu löschen. Ich lösche es mit dem folgenden Code:SQLAlchemy immer noch in der Lage, ein Objekt aus der Sitzung nach dem Löschen zu bekommen
my_object = Object.query.get(id)
db.session.delete(my_object)
db.session.commit()
return json.dumps({'success': True}
ich einen API-Test habe den Endpunkt zu testen, wo ich ein Objekt erstellen und dann den Endpunkt verwenden, um es zu löschen. Ich versuche zu behaupten, dass nach der Löschung geschieht es nicht in der Datenbank ist.
my_object = MyObject()
db.session.add(my_object)
db.session.commit()
response = requests.delete('{}/my-object/{}'.format(
os.environ.get('MY_URL'),
my_object.id
))
self.assertTrue(response.json()['success']) // this passes
self.assertEqual(200, response.status_code) // this passes
result = db.session.query(MyObject).get(my_object.id)
print(result.id) // prints the id of the job even though it is deleted from the database
Ich denke, das bis zu einem gewissen SQLAlchemy Sitzung Caching verwendet ist. Ich habe db.session.flush()
, db.session.expire_all()
vergeblich versucht. Das Objekt wird tatsächlich aus der Datenbank gelöscht. So würde ich erwarten, dass das Abfrageergebnis None
ist.
Ich sehe das in der docs aber habe nicht meinen ganzen Kopf darum gewickelt. when to commit and close a session
Danke für jede Hilfe.
Haben Sie versucht, vor der Abfrage aber nach dem Löschen zu committen? Oder vielleicht wäre das Öffnen einer neuen Sitzung noch sauberer. – 9000
Zwei Fragen, die helfen könnten, dies einzugrenzen: Führen Sie Ihren Server im selben Prozess? Verwendet Ihr Testframework Transaktionen, um die Datenbank nach jedem Test in den vorherigen Zustand zurückzusetzen? –
@ 9000 Ich bin mir nicht sicher, ob ich die erste Frage verstehe. Ich kann versuchen, eine neue Sitzung zu öffnen und zu sehen, ob das funktioniert. – brandonbanks