Question

Je vais avoir du mal à comprendre comment la base de données de niveaux d'isolation de travailler avec Flacon de SQLAlchemy, et surtout comment vraiment valider les modifications ou fermer une session.Voici le contexte de mon problème :

Je suis une utilisation en Flacon de SQLAlchemy pour un Flacon de projet avec une base de données MySQL.Voici comment est la configuration de mon projet

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'

La création de l' db l'objet de mon __init__.py fichier:

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
import config

app = Flask(__name__)
app.config.from_object('config')
db = SQLAlchemy(app)

J'ai défini des modèles tels que Printer un:

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

J'ai essayé de jouer avec un python terminal, et même si je l'ai lu au sujet de la Read committed le niveau d'isolation de SQLAlchemy, je suis face au problème suivant.Voici ce que j'ai dans ma console:

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

Quand je regarde la base de données, de mon changement a été commis :

mysql> SELECT * FROM printer;
+----+--------+
| id | name   |
+----+--------+
|  1 | Circle |
|  2 | Mww    |
|  3 | dummy  |
+----+--------+
3 rows in set (0.00 sec)

Si j'ai quitté mon python terminal, l'ouvrir à nouveau, et il suffit de lire les résultats de l'Imprimante.de la requête.tous les(), mes changements apparaissent.

Si je comprends SQLAlchemy attend pour que le changement soit commis et/ou la session est fermée, je ne comprends pas pourquoi je ne peux pas lire mes changements après la db.session.commit() déclaration ni comment fermer la session (j'ai essayé db.session.close(), la lecture de la base de données après qui ne donne pas de meilleurs résultats)

Merci pour votre aide!

Était-ce utile?

La solution

Qu'advient-il si vous utilisez la SQLAlchemy version de la requête?

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

Je me demandais si il y a deux sessions d'aller sur:

  1. La une de votre application configure Printer.query.all() est de parler à
  2. Celui que vous utilisez en ce que l'extrait de code que vous avez créé, par qui db = SQLAlchemy() appel

Cela expliquerait pourquoi l' db.session.commit() n'est-ce pas de rinçage les données Printer.query.all() a.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top