You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQLAlchemy中查询除主键与外键外的所有列

解决SQLAlchemy查询排除主键和外键列的问题

SQLAlchemy的Query对象本身没有内置的exclude参数(你试的all(exclude={...})行不通,因为all()方法根本不接受这个参数),但可以通过模型的元数据手动筛选出需要的列,直接构造查询,不用查完再删。

方法1:直接查询非主键/外键的列

先从模型的表结构里筛选出符合要求的列,再用这些列构建查询:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from your_models import User  # 替换成你的模型类

# 创建会话
engine = create_engine('your_database_url')
Session = sessionmaker(bind=engine)
session = Session()

# 筛选非主键、非外键的列
non_pk_fk_columns = [
    col for col in User.__table__.columns
    if not col.primary_key and not col.foreign_keys
]

# 执行查询,返回的是包含列值的元组
results = session.query(*non_pk_fk_columns).all()

方法2:返回字典格式的结果

如果想要更易读的字典结构(键是列名,值是对应数据),可以结合属性映射来实现:

from sqlalchemy.orm import class_mapper

# 获取模型的非主键/外键属性名
non_pk_fk_attrs = [
    prop.key for prop in class_mapper(User).iterate_properties
    if isinstance(prop, class_mapper(User).column_property_cls)
    and not prop.columns[0].primary_key
    and not prop.columns[0].foreign_keys
]

# 查询并转换为字典
query = session.query(*[getattr(User, attr) for attr in non_pk_fk_attrs])
results = [dict(zip(non_pk_fk_attrs, row)) for row in query.all()]

为什么你之前的尝试失败?

session.query(Table_Class).all(exclude={...}) 这种写法不成立,因为:

  • Query.all() 方法只负责执行查询并返回结果,不接受任何筛选列的参数;
  • SQLAlchemy的Query没有内置的“排除列”的API,必须主动指定要查询的列。

注意点

如果非要返回完整的模型实例(比如需要后续进行ORM操作),那确实只能在查询后手动移除主键/外键字段——因为模型实例的结构是由类定义决定的,必须包含所有列,无法在查询阶段直接生成“缺省某些列”的实例。但如果只是需要获取数据,优先用前面两种直接查询指定列的方式,既高效又避免后续处理。

内容的提问来源于stack exchange,提问作者Max

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 12:15:43