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!

Foi útil?

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:

  1. Aquele que seu aplicativo configura Printer.query.all() está conversando com
  2. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top