无法使用Redis对象映射器(ROM)进行查询
我正在使用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 个回答
你需要在传递名称的时候,加上 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)
这段内容分为两个部分。首先,如果你想通过一个设置了 unique=True
的列来获取某个项目,其实不需要使用索引,但查询的方式会有所不同。使用 unique=True
和 index=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
和 rom.Text
的键生成语义)。