2014-06-27 5 views
7

Ich versuche, die Ergebnisse zur gleichen Zeit von der DB zu begehen und abzufragen, und ich endete mit diesem Fehler.SQLAlchemy-Sitzungsfehler: InvalidRequestError

sqlalchemy.exc.InvalidRequestError: This session is in 'committed' state; no further SQL can be emitted within this transaction. 

Volltraceback:

Traceback (most recent call last): 
    File "C:\Python34\lib\site-packages\flask\app.py", line 1836, in __call__ 
    return self.wsgi_app(environ, start_response) 
    File "C:\Python34\lib\site-packages\flask\app.py", line 1820, in wsgi_app 
    response = self.make_response(self.handle_exception(e)) 
    File "C:\Python34\lib\site-packages\flask\app.py", line 1403, in handle_exception 
    reraise(exc_type, exc_value, tb) 
    File "C:\Python34\lib\site-packages\flask\_compat.py", line 33, in reraise 
    raise value 
    File "C:\Python34\lib\site-packages\flask\app.py", line 1817, in wsgi_app 
    response = self.full_dispatch_request() 
    File "C:\Python34\lib\site-packages\flask\app.py", line 1477, in full_dispatch_request 
    rv = self.handle_user_exception(e) 
    File "C:\Python34\lib\site-packages\flask\app.py", line 1381, in handle_user_exception 
    reraise(exc_type, exc_value, tb) 
    File "C:\Python34\lib\site-packages\flask\_compat.py", line 33, in reraise 
    raise value 
    File "C:\Python34\lib\site-packages\flask\app.py", line 1473, in full_dispatch_request 
    rv = self.preprocess_request() 
    File "C:\Python34\lib\site-packages\flask\app.py", line 1666, in preprocess_request 
    rv = func() 
    File "C:\Users\Ajay\PycharmProjects\Pypix-Flask\codehackr\auth\views.py", line 14, in before_request 
    if current_user.is_authenticated(): 
    File "C:\Python34\lib\site-packages\werkzeug\local.py", line 338, in __getattr__ 
    return getattr(self._get_current_object(), name) 
    File "C:\Python34\lib\site-packages\werkzeug\local.py", line 297, in _get_current_object 
    return self.__local() 
    File "C:\Python34\lib\site-packages\flask_login.py", line 46, in <lambda> 
    current_user = LocalProxy(lambda: _get_user()) 
    File "C:\Python34\lib\site-packages\flask_login.py", line 794, in _get_user 
    current_app.login_manager._load_user() 
    File "C:\Python34\lib\site-packages\flask_login.py", line 363, in _load_user 
    return self.reload_user() 
    File "C:\Python34\lib\site-packages\flask_login.py", line 325, in reload_user 
    user = self.user_callback(user_id) 
    File "C:\Users\Ajay\PycharmProjects\Pypix-Flask\codehackr\models.py", line 296, in load_user 
    u = db.session.query(User, unread_count).filter(User.id == user_id).first() 
    File "C:\Python34\lib\site-packages\sqlalchemy\orm\query.py", line 2333, in first 
    ret = list(self[0:1]) 
    File "C:\Python34\lib\site-packages\sqlalchemy\orm\query.py", line 2200, in __getitem__ 
    return list(res) 
    File "C:\Python34\lib\site-packages\sqlalchemy\orm\query.py", line 2404, in __iter__ 
    return self._execute_and_instances(context) 
    File "C:\Python34\lib\site-packages\sqlalchemy\orm\query.py", line 2417, in _execute_and_instances 
    close_with_result=True) 
    File "C:\Python34\lib\site-packages\sqlalchemy\orm\query.py", line 2408, in _connection_from_session 
    **kw) 
    File "C:\Python34\lib\site-packages\sqlalchemy\orm\session.py", line 843, in connection 
    close_with_result=close_with_result) 
    File "C:\Python34\lib\site-packages\sqlalchemy\orm\session.py", line 847, in _connection_for_bind 
    return self.transaction._connection_for_bind(engine) 
    File "C:\Python34\lib\site-packages\sqlalchemy\orm\session.py", line 298, in _connection_for_bind 
    self._assert_active() 
    File "C:\Python34\lib\site-packages\sqlalchemy\orm\session.py", line 192, in _assert_active 
    "This session is in 'committed' state; no further " 
sqlalchemy.exc.InvalidRequestError: This session is in 'committed' state; no further SQL can be emitted within this transaction. 

views.py

@main.route('/user/<username>', methods=['GET','POST']) 
def user(username): 
    form = SkillForm() 
    if form.validate_on_submit(): 
     skill_add = Skill(skill=form.skill.data, author=current_user._get_current_object()) 
     db.session.add(skill_add) 
     return redirect(url_for('main.index')) 
    user = User.query.filter_by(username=username).first_or_404() 
    page = request.args.get('page', 1, type=int) 
    pagination = user.posts.order_by(Post.timestamp.desc()).paginate(
     page, per_page=current_app.config['POSTS_PER_PAGE'], 
     error_out=False) 
    posts = pagination.items 
    skills = user.skills.all() 
    return render_template('user/user.html', user=user, posts=posts, 
          pagination=pagination, form=form, skills=skills) 

Wie um diesen Fehler zu beheben. Danke

+0

Versuchen Sie 'db.session.commit()' nach 'db.session.add()' – AlexLordThorsen

+0

oder 'db.session.rollback()' hinzuzufügen. Ich würde vorschlagen, dass Sie sich die Erweiterung [Flask-SQLAlchemy] (https://github.com/mitsuhiko/flask-sqlalchemy) ansehen, anstatt SQLAlchemy standardmäßig zu verwenden, da Flask SQLAlchemy sich um die meisten dieser Fehler kümmert. –

Antwort

3

Da Sie über db.session.add() einige Objekte zur Sitzung hinzugefügt haben, müssen Sie diese Änderungen zuerst festschreiben oder zurückrollen, um Abfragen mit derselben Sitzung durchführen zu können.

db.session.add(skill_add) 
db.session.commit() # add this line 
return redirect(url_for('main.index')) 

Hinzufügen der Linie wahrscheinlich in Ihrem Code angegeben würde arbeiten wie Sie es erwarten.

Auch wenn Sie eine Fähigkeit hinzufügen, die einen Benutzer abfragt, wird dieser Fehler ausgelöst, da diese beiden durch eine Beziehung gebunden sind. Wenn Sie also nach einem Benutzer suchen, fragen Sie auch nach den Fähigkeiten dieses Benutzers.