Вопрос

У меня возникли проблемы с пониманием того, как уровни изоляции базы данных работают с 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() 

Мне интересно, будут ли проводиться две сессии:

  1. Тот, который настроен вашим приложением Printer.query.all() разговаривает с
  2. Тот, который вы используете в том фрагменте, который вы создали этим db = SQLAlchemy() вызов

Это объяснило бы, почему db.session.commit() не сбрасывает данные, которые Printer.query.all() имеет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top