Nivel de aislamiento con Flask-SQLAlchemy
-
21-12-2019 - |
Pregunta
Tengo problemas para entender cómo funcionan los niveles de aislamiento de la base de datos con Flask-SQLAlchemy y, especialmente, cómo en realidad confirmar cambios o cerrar una sesión.Aquí está el contexto de mi problema:
Estoy usando Flask-SQLAlchemy para un proyecto Flask con una base de datos MySQL.Así es como está configurado mi proyecto.
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 creación del db
objeto en mi __init__.py
archivo:
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
import config
app = Flask(__name__)
app.config.from_object('config')
db = SQLAlchemy(app)
He definido modelos como Printer
uno:
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
Intenté jugar con una terminal Python y, aunque leí sobre el Read committed
nivel de aislamiento de SQLAlchemy, me enfrento al siguiente problema.Esto es lo que tengo en mi consola:
>>> 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
>>>
Cuando busco la base de datos, mi cambio se ha confirmado:
mysql> SELECT * FROM printer;
+----+--------+
| id | name |
+----+--------+
| 1 | Circle |
| 2 | Mww |
| 3 | dummy |
+----+--------+
3 rows in set (0.00 sec)
Si salgo de mi terminal Python, la abro nuevamente y simplemente leo los resultados con Printer.query.all(), aparecen mis cambios.
Aunque entiendo que SQLAlchemy espera a que se confirmen los cambios y/o se cierre la sesión, no entiendo por qué no puedo leer mis cambios después del db.session.commit()
declaración ni cómo cerrar la sesión (intenté db.session.close()
, leer la base de datos después de eso no da mejores resultados)
¡Gracias por tu ayuda!
Solución
¿Qué sucede si usa la versión SQLAlchemy de la consulta?
db.session.query(Printer).all()
Me pregunto si hay dos sesiones en marcha:
- El que tu aplicación configura
Printer.query.all()
esta hablando con - El que estás usando en ese fragmento que creaste con ese
db = SQLAlchemy()
llamar
Explicaría por qué el db.session.commit()
no está eliminando los datos que Printer.query.all()
tiene.