我无法理解数据库隔离级别如何与 Flask-SQLAlchemy 一起工作,尤其是如何真正提交更改或关闭 session 。这是我的问题的背景:
我将 Flask-SQLAlchemy 用于带有 MySQL 数据库的 Flask 项目。 这是我的项目的配置方式
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'
在我的 __init__.py
文件中创建 db
对象:
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 终端,尽管我阅读了 SQLAlchemy 的 Read committed
隔离级别,但我还是遇到了以下问题。这是我的控制台中的内容:
>>> 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 等待更改提交和/或 session 关闭,但我不明白为什么在 db.session.commit()
之后我无法读取我的更改> 声明和如何关闭 session (我尝试了 db.session.close()
,之后读取数据库并没有给出更好的结果)
感谢您的帮助!
最佳答案
如果您使用查询的 SQLAlchemy 版本会怎样?
db.session.query(Printer).all()
我想知道是否有两个 session 正在进行:
- 您的应用设置的那个
Printer.query.all()
正在与之对话 - 您在通过
db = SQLAlchemy()
调用创建的片段中使用的片段
这可以解释为什么 db.session.commit()
没有刷新 Printer.query.all()
拥有的数据。
关于python - Flask-SQLAlchemy 的隔离级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25024302/