python - Flask-SQLAlchemy 的隔离级别

标签 python mysql flask sqlalchemy flask-sqlalchemy

我无法理解数据库隔离级别如何与 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 正在进行:

  1. 您的应用设置的那个 Printer.query.all() 正在与之对话
  2. 您在通过 db = SQLAlchemy() 调用创建的片段中使用的片段

这可以解释为什么 db.session.commit() 没有刷新 Printer.query.all() 拥有的数据。

关于python - Flask-SQLAlchemy 的隔离级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25024302/

相关文章:

python - SQLAlchemy 和多列不区分大小写的查询

python - 如何在一个容器中运行 Flask 和 celery?

python - 如何最好地组织 Django 系统的规则组件?

python - smtplib.SMTPSenderRefused : (530, b'5.7.0 需要身份验证。了解更多信息,请访问\n5.7.0 https ://support. google.2 - gsmtp', 'noreply@demo.com' )

python - Matplotlib Table Bbox - 如何控制位置和样式?

MySQL Workbench - 无法连接到特定数据库

mysql - SQL 显示 count() 中的值

php - 两种 PHP 缓存技术

python - 如何在线性回归中强制零截距?

Python类: Lambda Name Error - Name not defined