مستوى العزلة مع قارورة-سكلالكيمي
-
21-12-2019 - |
سؤال
أواجه مشكلة في فهم كيفية عمل مستويات عزل قاعدة البيانات مع قارورة-سكلالشيمي ، وخاصة كيفية حقا إجراء تغييرات أو إغلاق جلسة.هنا هو سياق مشكلتي :
أنا باستخدام قارورة-سكلالشيمي لمشروع قارورة مع قاعدة بيانات الخلية.هنا هو كيف يتم تكوين مشروعي
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
حاولت اللعب مع محطة بيثون ، وعلى الرغم من أنني قرأت عن 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)
إذا تركت بلدي محطة بيثون ، فتحه مرة أخرى ومجرد قراءة النتائج مع الطابعة.الاستعلام.جميع () ، تظهر التغييرات بلدي.
على الرغم من أنني أفهم سكلالشيمي ينتظر التغيير لتكون ملتزمة و/أو الدورة لتكون مغلقة ، وأنا لا تحصل لماذا لا أستطيع قراءة التغييرات بلدي بعد db.session.commit()
بيان ولا كيفية إغلاق الدورة (حاولت db.session.close()
, ، قراءة قاعدة البيانات بعد ذلك لا تعطي نتائج أفضل)
شكرا لمساعدتكم!
المحلول
ماذا يحدث إذا كنت تستخدم إصدار سكلالشيمي من الاستعلام?
db.session.query(Printer).all()
أنا أتساءل عما إذا كان هناك دورتان مستمرة:
- واحد التطبيق الخاص بك يضع ذلك
Printer.query.all()
يتحدث إلى - الشخص الذي تستخدمه في هذا المقتطف الذي قمت بإنشائه بواسطة ذلك
db = SQLAlchemy()
اتصل
من شأنه أن يفسر لماذا db.session.commit()
لا مسح البيانات التي Printer.query.all()
لديها.