Flask-Sqlalchemyを使用した絶縁レベル
-
21-12-2019 - |
質問
私は、データベースの分離レベルがFlask-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'
.
My 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
Oneのようなモデルを定義しています:
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がコミットされるべき変更を待ち受けやセッションを閉じることを待っていますが、db.session.commit()
ステートメントの後に私の変更を読むことができない理由も、セッションの閉鎖方法(db.session.close()
を試しました)その後データベースを読んでもっと良い結果は得られません)
あなたの助けをありがとう!
解決
Sqlalchemyバージョンのクエリを使用するとどうなりますか?
db.session.query(Printer).all()
.
2つのセッションが起こっているのか疑問に思う:
- あなたのアプリは
Printer.query.all()
が と話しているのを設定します。
- その
db = SQLAlchemy()
呼び出しによって作成したそのスニペットで使用しているものは
db.session.commit()
がPrinter.query.all()
が持つデータをフラッシュしていない理由を説明します。
所属していません StackOverflow