使用SQLAlchemy检索所有列,但排除某些列

16 投票
2 回答
15884 浏览
提问于 2025-04-17 13:53

我正在制作一个网络服务,它会以JSON格式发送特定的表格数据。
我使用SQLAlchemy来和数据库进行沟通。

我想要获取用户有权限查看的列。

有没有办法告诉SQLAlchemy不要获取某些列?
虽然这样说不太准确,但大概是这个意思:

SELECT * EXCEPT column1 FROM table.

我知道在SELECT语句中可以指定某些列,但这并不是我想要的,因为我并不知道所有的表格列。我只是想要所有的列,除了某些特定的。

我也尝试过获取所有的列,然后删除我不想要的列属性,像这样:

 result = db_session.query(Table).all()
 for row in result:
     row.__delattr(column1)

但看起来SQLAlchemy不允许这样做。
我收到了这个警告:

Warning: Column 'column1' cannot be null 
cursor.execute(statement, parameters)
ok

你们觉得最优化的做法是什么呢?

谢谢!

2 个回答

6

你可以把某一列设置为延迟加载列。这个功能允许表格中的特定列只有在直接访问时才会被加载,而不是在使用查询时就加载所有内容。

详细信息可以查看 延迟加载列

25

你可以把表格里的所有列都传给查询方法,除了你不想要的那些列。

session.query(*[c for c in User.__table__.c if c.name != 'password'])

下面是一个可以运行的例子:

#!/usr/bin/env python

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import Session


Base = declarative_base()
class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    fullname = Column(String)
    password = Column(String)

    def __init__(self, name, fullname, password):
        self.name = name
        self.fullname = fullname
        self.password = password

    def __repr__(self):
       return "<User('%s','%s', '%s')>" % (self.name, self.fullname, self.password)

engine = create_engine('sqlite:///:memory:', echo=True)

Base.metadata.create_all(engine)
session = Session(bind=engine)
ed_user = User('ed', 'Ed Jones', 'edspassword')
session.add(ed_user)
session.commit()

result = session.query(*[c for c in User.__table__.c if c.name != 'password']).all()
print(result)

撰写回答