我难以了解数据库隔离级别如何与烧瓶-sqlalchemy合作,尤其是如何真正提交或关闭会话。这是我的问题的背景:

我正在使用MySQL数据库的烧瓶项目的Flask-Sqlalchemy。 以下是如何配置我的项目

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)
.

我已经定义了诸如世代odicetagcode之类的模型:

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的Printer级别,我面临以下问题。这是我在我的控制台中所拥有的内容:

>>> 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.ured.all()读取结果,显示我的更改。

虽然我理解sqlalchemy等待更改要提交和/或要关闭的会话,但我没有得到原因,为什么我无法在Read committed语句之后读取我的更改,也不是如何关闭会话(我尝试了db.session.commit(),在此之后读取数据库并不提供更好的结果)

谢谢你的帮助!

有帮助吗?

解决方案

如果使用查询的sqlalchemy版本,会发生什么?

db.session.query(Printer).all() 
.

我想知道是否有两个会话正在进行中:

  1. 您的应用程序设置的那个属性划线正在与
  2. 交谈
  3. 您使用该世代odicetagcode呼叫
  4. 创建的那个代码段中的那个

    它将解释为什么Printer.query.all()不刷属于生成的数据。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top