gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 11:21:12 31 4
gpt4 key购买 nike

我正在使用 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)

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

最佳答案

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

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

为了帮助防止此类与索引/查询相关的问题,我在用户尝试通过不存在的索引过滤数据时添加了 QueryError 异常。我将在今晚晚些时候发布带有这些更改的 0.31.4。

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

[1] 并非 rom 中的所有“like”查询都很慢,但那些很快的查询需要非通配符前缀来限制要扫描/过滤的数据范围。

关于python - 将所有 python-rom 对象放入列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31545430/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com