2012-07-21 46 views
2

不知道这是否可能,但我正在使用sqlalchemy和我的查询返回所有的项目作为对象。我想搜索该对象列表中的项目,但不必每次都执行for循环。我可以搜索没有for循环的对象列表中的项目吗?

这是我怎么知道现在目前做:

for x in objects_from_query: 
    print x.name, ' - ', x.age 

,如果我想看看我的数据名为我的列表“鲍勃”的用户,我将不得不:

for x in objects_from_query: 
    if x.name == 'bob': 
     print 'bob exists!' 

因为我必须做很多事情,我想知道是否有更快的方法来查找bob是否存在,而无需每次都执行for循环?通常使用列表时,我会执行诸如objects_from_query.index(“bob”)之类的操作,但是在使用普通列表而不是普通列表时,是否有类似的东西?

+2

你为什么不得到SQLAlchemy的查询直接让它只返回你感兴趣的对象? – 2012-07-21 21:34:22

+0

@DanielRoseman我想这与我的例子没有任何意义,但我真正的疑问是拉取与单个用户相关的数据,我试图交叉引用他们输入的数据与我已有的数据。我认为与SQLAlchemy相比,我的大型查询会比较难以获取当前所有数据并进行比较。我可能是错的,所以我会测试你的想法,这听起来很有趣。 – Lostsoul 2012-07-21 21:37:49

+2

“任何应用程序的经验法则都是让数据库完成它的工作:过滤,排序和连接。”检查此答案:http://www.stackoverflow.com/questions/2324050/is-it-better-to-filter-a-resultset-using-a-where-clause-or-using-application-cod – hectorg87 2012-07-21 21:42:28

回答

4

,您可以使用.filter方法在Query对象上,它将SQL转换为where子句。像下面的内容将工作: -

import sqlalchemy as sql 

    session = sql.orm.sessionmaker(bind=sql.create_engine('sqlite:///sql.db')) 
    Bob = session.query(Names).filter(Names.name == "bob") 
+0

有趣..这就像丹尼尔罗斯曼的想法,但它可能通过一个列表过滤?比如如果我有10个名字呢? – Lostsoul 2012-07-21 21:41:44

+0

为简单起见,我截断了这个例子(来自我的一些代码)。我会在一秒钟内添加一些链接到相关的sqlalchemy文档 – 2012-07-21 21:42:40

+0

那好吧,我可以找到它,如果它存在。我只是不知道我是否可以做到这一点。这对我来说会更好。虽然我猜我被for循环每个项目,但它会减少数据去..虽然..谢谢。 – Lostsoul 2012-07-21 21:44:16

3

答案:否。你需要一个循环,无论你使用的是什么数据结构,来自van Emde Boas,阵列,堆等。

这就是为什么你应该学习编程:为了能够找到一个数据结构,例如for循环尽快找到你需要的东西。

3

如何过滤器,以获得与名为Bob的所有对象,如:

filter(lambda x: x.name == 'bob', objects_from_query) 

这仍然可能运行一个循环之下,但如果你正在寻找写它更简洁的方式,这很好。

3

我真的不能谈的第一个,但第二个,这样的事情可能如果您使用SQLAlchemy的真正加快的办法

print(x.name == 'bob' in objects_from_query) 
相关问题