和士纯白郎 2025-03-31 17:21 采纳率: 0%
浏览 7

在使用tornado搭配sqlalchemy时出现的session失效问题

在使用tornado搭配sqlalchemy时出现的session失效问题
Session = sessionmaker(bind=engine)
session = Session()

for project_row in projects:
  # 根据人员id,查询人员姓名
  mans = project_row.assessors.split(',') if project_row.mans else []
  mans_result = []
  for man in mans:
    name = session.query(UserInfo.describe).filter(UserInfo.id == int(assessor)).first()
    dict_man = {
      'id': assessor,
      'name': name[0] if name else ''}
    mans_result.append(dict_man)
  project_row.mans = mans_result

# 根据项目负责人id,查询项目负责人姓名
project_leaders = project_row.project_leader.split(',') if project_row.project_leader else []
  project_leader_result = []
  for leader in project_leaders:
    leader = int(leader)
    #------------------------下面这句语句报错ProgrammingError("(psycopg2.ProgrammingError) can't ada 
    # pt type 'dict'")
    name = session.query(UserInfo).filter(UserInfo.id == leader).first()
    project_leader_result.append({'id': leader, 'name': name[0] if name else ''})
    project_row.project_leader = project_leader_result

在去掉mans的查询之后就不会报错;
这是什么原因??

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2025-03-31 17:22
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    问题解答

    在使用 Tornado 搭配 SQLAlchemy 时,可能会出现 Session 失效的问题。这个问题通常是由于 Tornado 的异步编程模型和 SQLAlchemy 的会话机制不兼容导致的。

    在 Tornado 中,每个请求都是独立的线程,这意味着每个请求都需要一个独立的会话。如果你在一个请求中创建了一个会话,然后在另一个请求中使用这个会话,这可能会导致会话失效。

    解决这个问题的一种方法是使用 Tornado 的 async with 语句来管理会话。例如:

    class MyHandler(tornado.web.RequestHandler):
        async def get(self):
            async with Session() as session:
                # 使用 session
                pass
    

    在上面的代码中,我们使用 async with 语句来创建一个会话,然后在这个会话中执行一些操作。这样可以确保每个请求都有一个独立的会话。

    另外,你也可以使用 Tornado 的 IOLoop 对象来管理会话。例如:

    class MyHandler(tornado.web.RequestHandler):
        def get(self):
            self.ioloop.add_callback(self.create_session)
    
        def create_session(self):
            session = Session()
            # 使用 session
            pass
    

    在上面的代码中,我们使用 IOLoop 对象来添加一个回调函数,这个回调函数将在下一个事件循环中执行。这样可以确保每个请求都有一个独立的会话。

    总之,使用 Tornado 搭配 SQLAlchemy 时,需要正确地管理会话,以避免会话失效的问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月31日