Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Retrieving all columns but some with SQLAlchemy

I'm making a WebService that sends specific tables in JSON. I use SQLAlchemy to communicate with the database.

I'd want to retrieve just the columns the user has the right to see.

Is there a way to tell SQLAlchemy to not retrieve some columns ? It's not correct but something like this :

SELECT * EXCEPT column1 FROM table.

I know it is possible to specify just some columns in the SELECT statement but it's not exactly what I want because I don't know all the table columns. I just want all the columns but some.

I also tried to get all the columns and delete the column attribute I don't want like this :

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

but it seems SQLAlchemy doesn't allow to do this. I get the warning :

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

What would be the most optimized way to do it for you guys ?

Thank you

like image 504
Yohan D Avatar asked Jan 28 '13 05:01

Yohan D


1 Answers

You can pass in all columns in the table, except the ones you don't want, to the query method.

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

Here is a runnable example:

#!/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)
like image 115
Gary van der Merwe Avatar answered Sep 27 '22 22:09

Gary van der Merwe