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!

War es hilfreich?

Lösung

Was passiert, wenn Sie die SQLAlchemy-Version der Abfrage verwenden?

db.session.query(Printer).all() 

Ich frage mich, ob zwei Sitzungen stattfinden:

  1. Die, die Ihre App dafür einrichtet Printer.query.all() spricht mit
  2. 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top