SQLalchemy按名称查询列

SQLalchemy按名称查询列,sqlalchemy,Sqlalchemy,我需要通过不同的字段值选择多个用户,比如,field是一个列名称字符串,比如“name”或“email”: users = meta.Session.query(User) \ .filter(User[field].in_(values)) \ .all() 如何以编程方式通过名称访问列?如果我理解得很好,您可以使用或标准,请参见以下示例: from sqlalchemy import create_engine, Column, types from sqlalchemy.

我需要通过不同的字段值选择多个用户,比如,
field
是一个列名称字符串,比如“name”或“email”:

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

如何以编程方式通过名称访问列?

如果我理解得很好,您可以使用或标准,请参见以下示例:

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\u列
,请注意将参数插入查询时不进行任何转换如果您接受来自应用程序外部的文本参数值,这可能会使您面临SQL注入漏洞