session.execute()和session.query()区别

session.execute()session.query() 都是 SQLAlchemy 中用于执行数据库操作的方法,但它们的使用场景和返回结果有所不同。

  1. session.query()

    • 主要用于执行ORM查询,它返回的是一个 Query 对象,可以进一步链式调用进行过滤、排序等操作,并最终通过 all()first()one() 等方法获取结果。
    • 查询结果通常会映射到相应的 ORM 类实例上。

    示例:

    from sqlalchemy.orm import sessionmaker
    from models import User  # 假设User是一个已映射到数据库表的ORM类
    
    Session = sessionmaker(bind=engine)
    session = Session()
    
    # 执行查询并获取所有用户
    users_query = session.query(User)
    users = users_query.all()
    for user in users:
        print(user.id, user.name)  # 输出:(1, 'John'), (2, 'Jane')...
    
  2. session.execute()

    • 更通用的方法,可用于执行SQL语句(包括原生SQL查询以及ORM表达式)。
    • 它既可以执行SELECT查询也可以执行INSERT、UPDATE、DELETE等操作。
    • 返回值通常是 ResultProxy 对象,可以通过迭代器或 fetch 方法来获取结果。对于SELECT查询,如果直接遍历ResultProxy对象,每条记录将作为元组返回;若映射到了ORM模型,则为模型实例。

    示例:

    # 执行原生SQL查询
    stmt = text("SELECT id, name FROM users")
    results = session.execute(stmt)
    
    # 结果以元组形式返回
    for row in results:
        print(row.id, row.name)
    
    # 或者执行ORM查询表达式
    from sqlalchemy.sql import select
    stmt = select(User.id, User.name)
    orm_results = session.execute(stmt)
    
    # 结果同样可以映射到ORM模型
    for user_row in orm_results:
        print(user_row.id, user_row.name)  # 如果映射了User模型,这里将是User实例属性
    

总结来说,session.query() 更适合于ORM风格的查询,并且结果自动映射到ORM类实例。而session.execute()更灵活,可以处理各种SQL语句,其返回的结果是否映射到ORM类取决于执行的具体查询内容和配置方式。