将所有python-rom对象放入列表
我正在使用烧瓶和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)
我以为h将有一个对象列表。我究竟做错了什么?(我被“。”过滤,因为我想知道它会得到它)
回答:
您提供的代码有两个问题,这些问题解释了为什么获得结果。
第一个问题是您的查询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中的所有“喜欢”查询都很慢,但是快速的查询需要非通配符前缀以限制要扫描/过滤的数据范围。
以上是 将所有python-rom对象放入列表 的全部内容, 来源链接: utcz.com/qa/414224.html