2015-07-21 68 views
0

我正在使用flask和redis。我决定尝试使用redis orm(http://pythonhosted.org/rom/)来管理一些稍微复杂的数据结构。我有对象的列表,让说:将所有python-rom对象放入列表中

urls = ['www.google.com', 'www.example.com', 'www.python.org'] 

我也有ROM模型:

class Stored_url(rom.Model): 
    url = rom.String(required=True, unique=True, suffix=True) 
    salt = rom.String() 
    hash = rom.String() 
    created_at = rom.Float(default=time.time) 

这似乎是工作在我的dev的设置。我已将大约25个'Stored_url'对象加载到REDIS中(在cmd行确认)。我试图想出一种将所有Stored_url类型的对象放入python列表的方法。

>>> test = Mymodels.Stored_url 
>>> type(test) 
Out[35]: rom._ModelMetaclass 
>>> h =test.query.filter(url ='.').all() 
>>> h.count() 
Traceback (most recent call last): 
    File "C:\envs\virtalenvs\flaskenv\lib\site-packages\IPython\core\interactiveshell.py", line 3035, in run_code 
    exec(code_obj, self.user_global_ns, self.user_ns) 
    File "<ipython-input-37-43f0dc233d70>", line 1, in <module> 
    h.count() 
TypeError: count() takes exactly one argument (0 given) 

我以为h会有一个对象列表。我究竟做错了什么? (我过滤的是“。”,因为我想通过网址获得)

回答

1

您提供的代码有两个问题,它们解释了为什么您会得到结果。

第一个问题是您的查询test.query.filter(url ='.').all()将返回一个空列表。这将仅返回一个空列表,因为您没有有效的索引与您指定的过滤器一起使用。你确实有2个索引 - 一个唯一的索引(用于查找精确字符串的url)和一个后缀索引(对于查找以某个字符串结尾的url有用) - 但都不能提供按照在关系世界中有一个“喜欢”的查询。前缀索引(使用prefix=True创建)可让您使用test.query.like(url='*.'),但这会非常慢(它执行索引扫描而不是直接查找[1])。

为了帮助防止这样的索引/查询相关的问题,当用户尝试通过不存在的索引筛选其数据时,我添加了QueryError异常。随着这些变化,我将在今晚晚些时候发布0.31.4。

你有第二个错误,这是异常的原因是你没有参数调用.count()。在您的h.count()调用,type(h) == list和Python列表对象的位置需要一个参数来计算与列表中提供的参数相等的值。如果您跳过原始查询的.all()部分,则会返回查询对象。该查询对象具有.count()方法,并且会返回匹配结果的计数。

[1]并非所有在'rom'中的'like'查询都很慢,但那些速度较快的查询需要使用非通配符前缀来将数据范围限制为扫描/过滤。

+0

非常感谢Josiah。 – user61629