无法使用Redis Object Mapper(ROM)查询

时间:2014-06-12 19:59:34

标签: python redis

我使用的是Redis Object Mapper(ROM)here

这是我的模特

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 is a model instance

但是当我做的时候

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

我得到[](空结果)

不知道为什么会这样?

2 个答案:

答案 0 :(得分:1)

这有两个部分。首先,如果您想通过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.String {1}}和rom.Text密钥生成语义)。

答案 1 :(得分:0)

您需要将index = True与name一起传递,以允许过滤器查询它。

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)