Sqlalchemy.exc.InvalidRequestError:会话处于准备状态

时间:2021-05-16 09:12:02

标签: sqlalchemy

Sqlalchemy.exc.InvalidRequestError:会话处于准备状态

我已经建立了一个像 webapp 这样的社交媒体,它通过无限滚动在你滚动时上传更多帖子。 但是,如果我在滚动时喜欢帖子,我会在开发模式下遇到错误。

我使用 python/flask 作为后端。

如果我滚动我的提要并同时喜欢我的帖子,在开发模式下,错误

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

到目前为止,这仅发生在开发模式而不是生产模式,但我担心如果更多人开始使用它会出现问题。

这是一个只会在开发中出现问题的错误,还是在我获得大量用户时也会出现在生产中?

我已经尝试在我的后端代码中加入 try except 语句来处理错误,但它会导致其他错误,所以我想知道这是一个以后会成为更大问题的问题,还是只是开发中的问题?

谢谢


我尝试添加一个可重现的示例,但很困难

从无限滚动开始。 在这种情况下,我首先加载不同帖子的索引

前端

HTML

 <div   class="flow">
   <div class="flowpost" v-for="post in postlists" :key="post.id" >
     <PostTemplate :iterated_list ="post.id"  ></PostTemplate>
   </div>
 </div>

其中 postlists 包含不同帖子的 id

脚本

  mounted(){
      window.onscroll = () => {
    let bottomOfWindow = document.documentElement.scrollTop + window.innerHeight === document.documentElement.offsetHeight;
    if (bottomOfWindow) {
      this.addmore()
    }
  };
  }

addmore 方法调用 get_index_list_of_posts 函数加载更多帖子

后端

def get_index_of_list_of_posts():
    user_id = request.args.get("userid")
    group_action_id = request.args.get("group_action_id")
    page_nr = request.args.get("page_nr")
    total_pages = 0
    result_dict = {}

other_posts_query__ = Session.query(mvpUsersToPosts.id).filter(mvpPosts.id==mvpUsersToPosts.mvp_posts_id  ).order_by(mvpPosts.datetime.desc()) 

pagettt = Paginator(other_posts_query__, 4)

p = pagettt.page(page_nr)
post_query = p.object_list
result_post = []
postlist = []

for post  in post_query:
    result_post = {
        "message":message,
        "id": post[0]
    }

    postlist.append(result_post)


result_dict_list = {}


result_dict_list["posts"] = postlist
result_dict_list["current_page_nr"] = page_nr
result_dict_list["total_page_nr"] = total_pages


posts_result = json.dumps(result_dict_list)
return posts_result

然后,我通过从 PostTemplate 组件调用以下后端函数,用其数据填充帖子。

def get_postlista_to_posttemplate():    
userid = request.args.get("userid")
postid = request.args.get("postid")
    result_post = []
    postlist = []

post_query = Session.query( mvpPosts,mvpUsers, mvpUsersToPosts,mvpSolutionTags).filter(mvpUsersToPosts.userid == mvpUsers.id ,mvpUsersToPosts.mvp_posts_id == mvpPosts.id, mvpUsersToPosts.id ==postid,   mvpPosts.id==mvpPostsToSolutionTags.mvp_posts_id, mvpSolutionTags.id==mvpPostsToSolutionTags.tagid).all()

    get_total_liked_query = Session.query( func.sum(mvpliked.liked)).filter(mvpliked.postid == postid).all()


    for post, users,user2post, tag  in post_query:

        result_post = {
            "postid": user2post.id,
            "mvp_post_postid" : post.id,
            "posttitle":post.posttitle,
            "posttype":post.posttype,
            "postimage":post.postimagevideo,
            'postliked':is_liked,
            }

        postlist.append(result_post)

    posts_result = json.dumps(postlist)

return posts_result

准备状态错误由 get_total_liked_query 发生,然后我将其包装在没有帮助的 try/except 语句中。

然后我可以喜欢使用以下后端功能完成的帖子。

  def like_post():
    reply = request.get_json()
    post_id = reply["post_id"]
    user_id= reply["user_id"]

    
    like_query = Session.query(mvpliked.liked).filter(mvpliked.postid == post_id, mvpliked.userid == user_id ).distinct(mvpliked.postid).all()

    if len(like_query) ==0:
        newrow = mvpliked(postid = post_id, userid = user_id, liked=1)
        Session.add(newrow)
        Session.commit()

    else:

        if (like_query[0][0] == 1):
            like_value = 0
        else:
            like_value = 1

        Session.query(mvpliked.liked).filter(mvpliked.postid == post_id, mvpliked.userid == user_id ).update({mvpliked.liked: like_value })
        Session.commit()

    return ""

invalidrequest 错误似乎在像_post() 和 get_postlista_to_posttemplate() 这样的函数同时运行时发生。


会话代码

engine = create_engine(DATABASE_URL_prod)
Base = declarative_base(engine)


def  loadDatabaseSession():
    Base.metadata.create_all(engine)
    DatabaseSession = sessionmaker(bind=engine)
    DatabaseSession = DatabaseSession()
    return DatabaseSession

Session = loadDatabaseSession()

0 个答案:

没有答案
相关问题