代码之家  ›  专栏  ›  技术社区  ›  Zack Plauché

SQLAlchemy ORM:为什么是行[0]。属性,而不仅仅是行。属性选择结果

  •  0
  • Zack Plauché  · 技术社区  · 3 年前

    为什么炼金术的创造者决定回归 rows 从…起 select 带有ORM表的语句(如 User(Base) )在 tuple 第一个结果是你期望的正常结果是什么?

    例如,如果您的查询是:

    user = session.execute(select(User)).first()
    

    他们为什么决定这样做:

    user_name = user[0].name
    

    比这更好:

    user_name = user.name
    

    默认情况下?

    1 回复  |  直到 3 年前
        1
  •  2
  •   Ian Wilson    3 年前

    我相信这样做是为了使API与核心API更加一致。这也使得一个参数与多个参数兼容,即 select(User) select(User, Company.name).join(User.company) 两者都返回名为tuple的行。文件中有一些解释: rowproxy-is-no-longer-a-proxy-is-now-called-row-and-behaves-like-an-enhanced-named-tuple

    根据评论添加了更多文档链接

    请注意,似乎有一些辅助方法可以使这种用法更简单, session.scalar , session.scalars , scalar scalars() 以达到你的预期用途。

    执行此任务的多种方法:

    # This is probably the most clear for a single result.
    user = session.scalar(select(User))
    user = session.scalars(select(User)).first()
    user = session.execute(select(User)).scalar()
    user = session.execute(select(User)).scalars().first()
    
    # for looping without needing to unpack 1-tuple
    for user in session.scalars(select(User)):
        print(user)
    
    

    与这种用法相比

    user, = session.execute(select(User)).first()
    user, company_name = session.execute(select(User, Company.name).join(User.company)).first()