插件窝 干货文章 如何在 SQLAlchemy 中指定查询字段名?

如何在 SQLAlchemy 中指定查询字段名?

字段 User 查询 使用 468    来源:    2025-03-31

在 SQLAlchemy 中指定查询字段名的方法

在 SQLAlchemy 中,有几种方法可以指定查询返回的字段名,以下是主要的几种方式:

1. 使用 with_entities() 方法

from sqlalchemy import select
from models import User

# 只查询特定字段
query = session.query(User).with_entities(User.id, User.username)

# 等同于
query = select(User.id, User.username)

2. 直接指定字段列表

# 查询特定字段并返回元组
results = session.query(User.id, User.username).all()

# 查询特定字段并返回字典
results = session.query(User.id.label('user_id'), User.username.label('name')).all()

3. 使用 label() 方法重命名字段

# 为字段指定别名
query = session.query(
    User.id.label('user_id'),
    User.username.label('user_name')
)

4. 使用 Core 方式的 select() (SQLAlchemy 1.4+ 推荐)

from sqlalchemy import select

stmt = select(User.id, User.username).where(User.active == True)
results = session.execute(stmt).all()

5. 使用 ORM 实体与字段混合查询

# 返回部分字段和完整实体
results = session.query(User.id, User.username, Address).join(Address).all()

6. 使用 column_property 定义计算字段

from sqlalchemy import column_property

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    firstname = Column(String(50))
    lastname = Column(String(50))
    fullname = column_property(firstname + " " + lastname)

# 查询时可以直接使用
session.query(User.fullname).all()

注意事项

  1. 当只查询部分字段时,返回的是元组而不是模型对象
  2. 使用 label() 可以为字段指定别名,这在复杂查询或连接查询中特别有用
  3. SQLAlchemy 2.0 更推荐使用 Core 方式的 select() 语法

以上方法可以根据具体需求选择使用,在性能敏感的场景下,只查询需要的字段可以显著提高查询效率。