将所有python-rom对象放入列表中

时间:2015-07-21 17:10:13

标签: python flask redis

我正在使用flask和redis。我决定尝试使用rom redis orm(http://pythonhosted.org/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)

这似乎与我的开发设置有关。我已将大约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)

我以为我会有一个对象列表。我究竟做错了什么? (我按“。”过滤,因为我想在网址上会有它)

1 个答案:

答案 0 :(得分:1)

您提供的代码有两个问题,可以解释您获得结果的原因。

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

为了帮助防止像这样的索引/查询相关问题,我在用户尝试按不存在的索引过滤数据时添加了QueryError异常。我将在今晚稍后释放0.31.4这些变化。

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

[1]并非所有&#39;喜欢&#39; rom中的查询速度很慢,但快速查询需要使用非通配符前缀来限制扫描/过滤数据范围。