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!

¿Fue útil?

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:

  1. El que tu aplicación configura Printer.query.all() esta hablando con
  2. 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top