Domanda

Ho difficoltà a capire come i livelli di isolamento del database funzionano con Flask-SQLalchemy, e in particolare come Really commettere modifiche o chiudere una sessione. Ecco il contesto del mio problema:

Sto usando Flask-SQLalchemy per un progetto di pallone con un database MySQL. Ecco come è configurato il mio progetto

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'
.

La creazione dell'oggetto db nel mio file __init__.py:

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
import config

app = Flask(__name__)
app.config.from_object('config')
db = SQLAlchemy(app)
.

Ho definito modelli come Printer One:

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
.

Ho provato a giocare con un terminale Python, e anche se ho letto il livello di isolamento di Read committed di SQLalchemy, affronto il seguente problema. Ecco cosa ho nella mia console:

>>> 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
>>> 
.

Quando cerco il database, è stato commesso il mio cambiamento:

mysql> SELECT * FROM printer;
+----+--------+
| id | name   |
+----+--------+
|  1 | Circle |
|  2 | Mww    |
|  3 | dummy  |
+----+--------+
3 rows in set (0.00 sec)
.

Se ho lasciato il mio terminale Python, aprilo di nuovo e semplicemente leggi i risultati con Printer.Query.ALL (), appaiono le mie modifiche.

Anche se capisco SQLalchemy attende che il cambiamento sia commesso e / o la sessione da chiudere, non capisco perché non riesco a leggere le mie modifiche dopo l'istruzione db.session.commit() né come chiudere la sessione (ho provato db.session.close(), Leggere il database dopo che non fornisce risultati migliori)

Grazie per il tuo aiuto!

È stato utile?

Soluzione

Cosa succede se usi la versione SQLalchemy della query?

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

Mi chiedo se ci sono due sessioni in corso:

    .
  1. Quello che la tua app imposta quel Printer.query.all() con
  2. Quello che stai utilizzando in quello snippet che hai creato da quella chiamata db = SQLAlchemy()
  3. Spiegherebbe perché il db.session.commit() non sta sciacquando i dati che ha generato Printer.query.all().

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top