2014-06-12 36 views
2

我正在使用Redis Object Mapper(ROM)here無法使用Redis Object Mapper(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 is a model instance

但是,當我做

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

我得到的[](空結果)

不能得到,爲什麼會出現這種情況?

回答

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定義的列,你需要傳遞一個自定義的參數凱基(你可以在https://github.com/josiahcarlson/rom/blob/master/rom/util.py#L149看到rom.util._string_keygen()rom.Stringrom.Text密鑰生成語義)。

+0

確保您的字符串參數是小寫字母。 '''#不要這樣 User.query.filter(NAME = '布萊恩')。所有() #Do這個 User.query.filter(NAME = '布萊恩')所有。() ''' – man2xxl

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) 
+0

我也試過這個。它不起作用。我仍然得到一個空的列表。 – iamkhush

+0

您需要在這種情況下提供keygen參數:name = rom.String(required = True,unique = True,index = True,keygen = text_keyge)然後檢查它是否可用 –

+0

或者嘗試:name = rom.Text = True,unique = True,index = True,keygen = text_keygen) –