我正在使用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)
我以为我会有一个对象列表。我究竟做错了什么? (我按“。”过滤,因为我想在网址上会有它)
答案 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中的查询速度很慢,但快速查询需要使用非通配符前缀来限制扫描/过滤数据范围。