Isolationsstufe mit Flask-SQLAlchemy
-
21-12-2019 - |
Frage
Ich habe Probleme zu verstehen, wie Datenbankisolationsstufen mit Flask-SQLAlchemy funktionieren und insbesondere, wie das geht Wirklich Änderungen festschreiben oder eine Sitzung schließen.Hier ist der Kontext meines Problems:
Ich verwende Flask-SQLAlchemy für ein Flask-Projekt mit einer MySQL-Datenbank.So ist mein Projekt konfiguriert
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://user:passwd@localhost/mydb'
SQLALCHEMY_MIGRATE_REPO = '/path/to/myapp/db_repository'
CSRF_ENABLED = True
SECRET_KEY = 'this is a secret'
Die Entstehung des db
Objekt in meinem __init__.py
Datei:
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
import config
app = Flask(__name__)
app.config.from_object('config')
db = SQLAlchemy(app)
Ich habe Modelle definiert wie Printer
eins:
from myapp import db
...
class Printer(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(120))
def __init__(self, name):
self.name = name
Ich habe versucht, mit einem Python-Terminal herumzuspielen, und obwohl ich darüber gelesen habe Read committed
Isolationsstufe von SQLAlchemy, ich stehe vor dem folgenden Problem.Folgendes habe ich in meiner Konsole:
>>> from myapp import app
>>> from myapp.models import Printer
>>> import config
>>> from flask.ext.sqlalchemy import SQLAlchemy
>>> app.config.from_object('config')
>>> db = SQLAlchemy(app)
>>> for printer in Printer.query.all():
... print printer.name
...
Circle
Mww
>>> p = Printer('dummy')
>>> db.session.add(p)
>>> db.session.commit()
>>> for printer in Printer.query.all():
... print printer.name
...
Circle
Mww
>>>
Wenn ich in der Datenbank nachschlage, wurde meine Änderung übernommen:
mysql> SELECT * FROM printer;
+----+--------+
| id | name |
+----+--------+
| 1 | Circle |
| 2 | Mww |
| 3 | dummy |
+----+--------+
3 rows in set (0.00 sec)
Wenn ich mein Python-Terminal beende, es erneut öffne und einfach die Ergebnisse mit Printer.query.all() lese, werden meine Änderungen angezeigt.
Obwohl ich verstehe, dass SQLAlchemy darauf wartet, dass Änderungen festgeschrieben und/oder die Sitzung geschlossen werden, verstehe ich nicht, warum ich meine Änderungen danach nicht lesen kann db.session.commit()
Anweisung noch wie man die Sitzung schließt (ich habe es versucht db.session.close()
, das anschließende Lesen der Datenbank führt nicht zu besseren Ergebnissen)
Vielen Dank für Ihre Hilfe!
Lösung
Was passiert, wenn Sie die SQLAlchemy-Version der Abfrage verwenden?
db.session.query(Printer).all()
Ich frage mich, ob zwei Sitzungen stattfinden:
- Die, die Ihre App dafür einrichtet
Printer.query.all()
spricht mit - Diejenige, die Sie in dem Snippet verwenden, das Sie dadurch erstellt haben
db = SQLAlchemy()
Anruf
Es würde erklären, warum das db.session.commit()
löscht die Daten nicht Printer.query.all()
hat.