【问题标题】:SQLalchemy query column by name [duplicate]SQLalchemy按名称查询列[重复]
【发布时间】:2017-11-18 04:12:49
【问题描述】:

我需要通过各种字段值选择多个用户,例如,field 是列名称的字符串,例如“名称”或“电子邮件”:

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

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

【问题讨论】:

    标签: sqlalchemy


    【解决方案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,请注意参数被插入到查询中而没有任何转换。 如果您从应用程序外部接受 text 参数的值,这可能会使您面临 SQL 注入漏洞

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      • 2019-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-07
      • 1970-01-01
      相关资源
      最近更新 更多