2015-06-22 71 views
1

后条件语句打破这是我有:Peewee:减少其中一定长度

SomeTable.select.where(reduce(operator.or_, (SomeTable.stuff == entry for entry in big_list))) 

的问题,当我在big_list元素的相对大名单出现,我得到这个:

RuntimeError: maximum recursion depth exceeded 

有没有另一种方法可以解决这个问题,不需要将列表分成几个块?

试过建议使用任何,这是我的错误:

Traceback (most recent call last): 
    File "C:/Users/f9xk3li/Documents/GitHub/leoshop_web/leoshop_web/data_models/data_model.py", line 347, in <module> 
    search_bins_all("BoA 0") 
    File "C:/Users/f9xk3li/Documents/GitHub/leoshop_web/leoshop_web/data_models/data_model.py", line 179, in search_bins_all 
    for d in generator.order_by(SomeTable.RetrievedDate.desc()): 
    File "C:\Users\f9xk3li\AppData\Local\Continuum\Anaconda\lib\site-packages\peewee.py", line 282, in inner 
    clone = self.clone() # Assumes object implements `clone`. 
    File "C:\Users\f9xk3li\AppData\Local\Continuum\Anaconda\lib\site-packages\peewee.py", line 2202, in clone 
    return self._clone_attributes(query) 
    File "C:\Users\f9xk3li\AppData\Local\Continuum\Anaconda\lib\site-packages\peewee.py", line 2412, in _clone_attributes 
    query = super(SelectQuery, self)._clone_attributes(query) 
    File "C:\Users\f9xk3li\AppData\Local\Continuum\Anaconda\lib\site-packages\peewee.py", line 2206, in _clone_attributes 
    query._where = self._where.clone() 
AttributeError: 'bool' object has no attribute 'clone' 

而这里的代码

generator = SomeTable.select() 
generator = generator.where(any(SomeTable.BIN == entry for entry in big_list)) 
for d in generator: 
    .... 

回答

1

尝试...where(SomeTable.BIN.in_(big_list))

PeeWee有限制,以什么可以用在自己的where条款,以便与图书馆合作。

http://docs.peewee-orm.com/en/latest/peewee/querying.html#query-operators

+0

哦,上帝,我为什么甚至可以编写的东西,简单的......我不记得曾经在文档TT –

+0

我也碰上了“变数太多”的错误看到.in_这样一个复杂的解决方案,但这是一个SQLite的限制,据说,这是非常好的! –

+2

如果你可以将'big_list'替换为PeeWee查询,那么我相信它会在数据库中完全查找,这可能会处理“太多变量”错误。 我今天第一次只浏览PeeWee文档,并且我不熟悉sqlite错误,但如果这是我的想法,那么我很确定这会帮助你。 –

1

要在经批准的回答雅各的评论扩大,我认为他的说法,你可以使用子查询,而不是解决所有的ID。

E.G.

admin_users = User.select().where(User.is_admin == True) 
admin_messages = Message.select().where(Message.user.in_(admin_users)) 
+0

这真是太棒了。如果我一会儿知道这个功能,那就太棒了。 –

+0

Peewee岩石,我能说什么? ;) – coleifer

+0

虽然问题,说在我的用户表中我有国家,我只想得到的国家,我会这样做:国家= User.select(User.country),然后做Message.select()。其中Message.country.in_(国家))? –