سؤال

أواجه مشكلة في فهم كيفية عمل مستويات عزل قاعدة البيانات مع قارورة-سكلالشيمي ، وخاصة كيفية حقا إجراء تغييرات أو إغلاق جلسة.هنا هو سياق مشكلتي :

أنا باستخدام قارورة-سكلالشيمي لمشروع قارورة مع قاعدة بيانات الخلية.هنا هو كيف يتم تكوين مشروعي

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

أنا أتساءل عما إذا كان هناك دورتان مستمرة:

  1. واحد التطبيق الخاص بك يضع ذلك Printer.query.all() يتحدث إلى
  2. الشخص الذي تستخدمه في هذا المقتطف الذي قمت بإنشائه بواسطة ذلك db = SQLAlchemy() اتصل

من شأنه أن يفسر لماذا db.session.commit() لا مسح البيانات التي Printer.query.all() لديها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top