如何在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
相关产品推荐
相关产品推荐

