【发布时间】:2017-11-18 04:12:49
【问题描述】:
我需要通过各种字段值选择多个用户,例如,field 是列名称的字符串,例如“名称”或“电子邮件”:
users = meta.Session.query(User) \
.filter(User[field].in_(values)) \
.all()
如何以编程方式通过名称访问列?
【问题讨论】:
标签: sqlalchemy
我需要通过各种字段值选择多个用户,例如,field 是列名称的字符串,例如“名称”或“电子邮件”:
users = meta.Session.query(User) \
.filter(User[field].in_(values)) \
.all()
如何以编程方式通过名称访问列?
【问题讨论】:
标签: sqlalchemy
如果我理解得很好,你可以使用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 注入漏洞。
【讨论】: