Уровень изоляции с помощью Flask-SQLAlchemy
-
21-12-2019 - |
Вопрос
У меня возникли проблемы с пониманием того, как уровни изоляции базы данных работают с Flask-SQLAlchemy, и особенно как их Действительно зафиксируйте изменения или закройте сеанс.Вот контекст моей проблемы:
Я использую Flask-SQLAlchemy для проекта Flask с базой данных MySQL.Вот как настроен мой проект
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'
Создание db
объект в моем __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)
Я определил такие модели, как Printer
один:
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
Я пытался поиграться с терминалом Python, и хотя я читал о Read committed
уровне изоляции SQLAlchemy, я столкнулся со следующей проблемой.Вот что у меня в консоли:
>>> 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
>>>
Когда я просматриваю базу данных, мое изменение было зафиксировано:
mysql> SELECT * FROM printer;
+----+--------+
| id | name |
+----+--------+
| 1 | Circle |
| 2 | Mww |
| 3 | dummy |
+----+--------+
3 rows in set (0.00 sec)
Если я выйду из терминала Python, открою его снова и просто прочитаю результаты с помощью Printer.query.all(), мои изменения появятся.
Хотя я понимаю, что SQLAlchemy ожидает фиксации изменений и/или закрытия сеанса, я не понимаю, почему я не могу прочитать свои изменения после db.session.commit()
заявление, ни как закрыть сеанс (я пробовал db.session.close()
, чтение базы после этого не дает лучших результатов)
Спасибо за вашу помощь!
Решение
Что произойдет, если вы используете версию запроса SQLAlchemy?
db.session.query(Printer).all()
Мне интересно, будут ли проводиться две сессии:
- Тот, который настроен вашим приложением
Printer.query.all()
разговаривает с - Тот, который вы используете в том фрагменте, который вы создали этим
db = SQLAlchemy()
вызов
Это объяснило бы, почему db.session.commit()
не сбрасывает данные, которые Printer.query.all()
имеет.