2014-06-27 14 views
7

Tôi đang cố gắng cam kết cũng như truy vấn kết quả cùng một lúc từ DB và tôi đã kết thúc với lỗi này.Lỗi phiên SQLAlchemy: InvalidRequestError

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

Full Traceback:

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) 

Làm thế nào để giải quyết lỗi này. Cảm ơn

+0

Thử thêm 'db.session.commit()' sau 'db.session.add()' – AlexLordThorsen

+0

hoặc 'db.session.rollback()'. Tôi sẽ đề nghị bạn hãy xem phần mở rộng [Flask-SQLAlchemy] (https://github.com/mitsuhiko/flask-sqlalchemy) thay vì sử dụng SQLAlchemy ra khỏi hộp kể từ khi Flask SQLAlchemy xử lý hầu hết các lỗi này. –

Trả lời

3

Vì bạn đã thêm một số đối tượng vào phiên qua db.session.add(), trước tiên bạn phải cam kết những thay đổi đó hoặc cuộn lại, để có thể thực hiện truy vấn bằng cùng một phiên này.

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

Việc thêm dòng được chỉ định có thể dẫn đến mã của bạn hoạt động như bạn mong đợi.

Ngoài ra, mặc dù bạn đang thêm kỹ năng, truy vấn người dùng, lỗi này được nâng lên vì hai người đó bị ràng buộc bởi mối quan hệ, vì vậy khi bạn truy vấn người dùng, bạn cũng truy vấn các kỹ năng mà người dùng này có.

Các vấn đề liên quan