无法使用Redis对象映射器(ROM)进行查询

3 投票
2 回答
680 浏览
提问于 2025-04-18 09:36

我正在使用Redis对象映射器(ROM),你可以在这里找到它。

这是我的模型:

class User(rom.Model): name = rom.String(required=True, unique=True) nickname = rom.String(required=False) photo = rom.String(required=False)

我尝试这样做:

user1 = User(name="Ankush", nickname="iamkhush", photo='http://graph.facebook.com/iamkhush/picture') user1.save()

当我这样做时,我得到了结果:

user = User.get(1) # user是一个模型实例

但是当我这样做时:

user_obj = User.query.filter(name='Ankush').execute()

我得到了[ ](一个空结果)

我搞不懂为什么会这样?

2 个回答

0

你需要在传递名称的时候,加上 index=True,这样才能通过过滤器进行查询。

class User(rom.Model):
name = rom.Text(required=True, unique=True,index = True,keygen=text_keyge)
nickname = rom.String(required=False)
photo = rom.String(required=False)
3

这段内容分为两个部分。首先,如果你想通过一个设置了 unique=True 的列来获取某个项目,其实不需要使用索引,但查询的方式会有所不同。使用 unique=Trueindex=False,你可以通过 User.get_by() 的方式来获取项目:

>>> User.get_by(name="Ankush")
<__main__.User object at 0x87070cc>

主要的限制是,你必须完全按照列的定义来传递整个字段的值。这个通常适用于保持电子邮件地址的唯一性(记得先把字母小写!)、用户名(注意大小写)等情况。

第二部分是,当启用索引时,索引对于字符串或文本列是“大小写不敏感的唯一词袋”语义(我来自搜索引擎领域,这里的语义和典型的数据库查询有很大不同,甚至可以说更好)。所以如果你想查找条目,你需要使用:

>>> class User(rom.Model):
...     name = rom.String(required=True, unique=True, index=True)
...     nickname = rom.String(required=False)
...     photo = rom.String(required=False)
... 
>>> user1 = User(name="Ankush", nickname="iamankush", photo="http://graph.facebook.com/iamkhush/picture")
>>> user1.save()
>>> User.query.filter(name="ankush").all()
[<__main__.User object at 0x870738c>]

(另外要注意, .execute().all() 的别名)。

如果你想改变使用 index=True 定义的列的大小写敏感性或其他行为,你需要传递一个自定义的 keygen 参数(你可以在 https://github.com/josiahcarlson/rom/blob/master/rom/util.py#L149 查看 rom.util._string_keygen(),了解 rom.Stringrom.Text 的键生成语义)。

撰写回答