Nível de isolamento com Flask-SQLAlchemy
-
21-12-2019 - |
Pergunta
Estou tendo problemas para entender como os níveis de isolamento do banco de dados funcionam com o Flask-SQLAlchemy e, especialmente, como realmente confirmar alterações ou fechar uma sessão.Aqui está o contexto do meu problema:
Estou usando Flask-SQLAlchemy para um projeto Flask com um banco de dados MySQL.Aqui está como está configurado meu projeto
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'
A criação do db
objeto em meu __init__.py
arquivo:
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
import config
app = Flask(__name__)
app.config.from_object('config')
db = SQLAlchemy(app)
Eu defini modelos como Printer
um:
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
Tentei brincar com um terminal python e, embora tenha lido sobre o Read committed
nível de isolamento do SQLAlchemy, enfrento o seguinte problema.Aqui está o que tenho no meu 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 procuro o banco de dados, minha alteração foi confirmada:
mysql> SELECT * FROM printer;
+----+--------+
| id | name |
+----+--------+
| 1 | Circle |
| 2 | Mww |
| 3 | dummy |
+----+--------+
3 rows in set (0.00 sec)
Se eu sair do meu terminal python, abri-lo novamente e apenas ler os resultados com Printer.query.all(), minhas alterações aparecerão.
Embora eu entenda que o SQLAlchemy espera que a alteração seja confirmada e/ou a sessão seja fechada, não entendo por que não consigo ler minhas alterações após o db.session.commit()
declaração nem como fechar a sessão (tentei db.session.close()
, ler o banco de dados depois disso não dá melhores resultados)
Obrigado pela ajuda!
Solução
O que acontece se você usar a versão SQLAlchemy da consulta?
db.session.query(Printer).all()
Gostaria de saber se há duas sessões acontecendo:
- Aquele que seu aplicativo configura
Printer.query.all()
está conversando com - Aquele que você está usando naquele trecho criado por aquele
db = SQLAlchemy()
chamar
Isso explicaria por que o db.session.commit()
não está liberando os dados que Printer.query.all()
tem.