Я делаю WebService, который отправляет конкретные таблицы в формате 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

Какой самый оптимальный способ сделать это для вас, ребята?

Спасибо

5
Yohan D 28 Янв 2013 в 09:58

2 ответа

Лучший ответ

Вы можете передать все столбцы в таблице, кроме тех, которые вам не нужны, в метод запроса.

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)
10
Gary van der Merwe 28 Янв 2013 в 07:47

Вы можете сделать столбец отложенным столбцом. Эта функция позволяет загружать определенные столбцы таблицы только при прямом доступе, а не при запросе объекта с использованием Query.

См. Загрузка отложенных столбцов

4
notpeter 7 Окт 2017 в 05:48