2015-11-24 3 views
0

мне нужно выбрать несколько пользователей от различных значений поля, как, где field является строкой имени столбца, как «имя» или «электронная почта»:SQLAlchemy столбцу запроса по имени

users = meta.Session.query(User) \ 
    .filter(User[field].in_(values)) \ 
    .all() 

Как программно доступ колонку по ее названию?

ответ

1

Если я хорошо понял, вы могли бы использовать literal_column или стандартный getattr см этот пример:

from sqlalchemy import create_engine, Column, types 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import sessionmaker, scoped_session 
from sqlalchemy.sql.expression import literal_column 

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

Base = declarative_base() 
session = scoped_session(sessionmaker(bind=engine)) 

class User(Base): 
    __tablename__ = "user" 
    login = Column(types.String(50), primary_key=True) 
    name = Column(types.String(255)) 

    def __repr__(self): 
     return "User(login=%r, name=%r)" % (self.login, self.name) 

Base.metadata.create_all(engine) 

if __name__ == '__main__': 

    # create two users  
    u1 = User(login='someone', name="Some one") 
    u2 = User(login='someuser', name="Some User") 
    u3 = User(login='user', name="User") 
    u4 = User(login='anotheruser', name="Another User") 
    session.add(u1) 
    session.add(u2) 
    session.add(u3) 
    session.add(u4) 
    session.commit() 

    print "using literal_column" 
    print session.query(User).filter(literal_column("login").in_(["someuser", "someone"])).all() 

    print "using getattr" 
    print session.query(User).filter(getattr(User, "login").in_(["someuser", "someone"])).all() 

выход:

using literal_column 
[User(login=u'someone', name=u'Some one'), User(login=u'someuser', name=u'Some User')] 
using getattr 
[User(login=u'someone', name=u'Some one'), User(login=u'someuser', name=u'Some User')] 

Если вы будете использовать literal_column, нужно учитывать, что аргумент вставляется запрос без каких-либо преобразований. Это может привести к уязвимости SQL Injection, если вы принимаете значения для текстового параметра вне приложения.

Смежные вопросы