11

我正在制作一个以 JSON 格式发送特定表的 WebService。我使用 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

对你们来说最优化的方法是什么?

谢谢

4

3 回答 3

16

您可以将表中的所有列(不需要的列除外)传递给查询方法。

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)
于 2013-01-28T07:47:31.130 回答
5

您可以使列成为延迟列。此功能允许仅在直接访问时加载表的特定列,而不是在使用 Query 查询实体时加载。

请参阅延迟列加载

于 2013-01-28T08:31:18.263 回答
-1

这对我有用

 users = db.query(models.User).filter(models.User.email != current_user.email).all()
 return users
于 2021-11-21T07:24:44.100 回答