2015-07-21 26 views
0

我正在使用flask和redis。我決定嘗試使用redis orm(http://pythonhosted.org/rom/)來管理一些稍微複雜的數據結構。我有對象的列表,讓說:將所有python-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) 

這似乎是工作在我的dev的設置。我已將大約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會有一個對象列表。我究竟做錯了什麼? (我過濾的是「。」,因爲我想通過網址獲得)

回答

1

您提供的代碼有兩個問題,它們解釋了爲什麼您會得到結果。

第一個問題是您的查詢test.query.filter(url ='.').all()將返回一個空列表。這將僅返回一個空列表,因爲您沒有有效的索引與您指定的過濾器一起使用。你確實有2個索引 - 一個唯一的索引(用於查找精確字符串的url)和一個後綴索引(對於查找以某個字符串結尾的url有用) - 但都不能提供按照在關係世界中有一個「喜歡」的查詢。前綴索引(使用prefix=True創建)可讓您使用test.query.like(url='*.'),但這會非常慢(它執行索引掃描而不是直接查找[1])。

爲了幫助防止這樣的索引/查詢相關的問題,當用戶嘗試通過不存在的索引篩選其數據時,我添加了QueryError異常。隨着這些變化,我將在今晚晚些時候發佈0.31.4。

你有第二個錯誤,這是異常的原因是你沒有參數調用.count()。在您的h.count()調用,type(h) == list和Python列表對象的位置需要一個參數來計算與列表中提供的參數相等的值。如果您跳過原始查詢的.all()部分,則會返回查詢對象。該查詢對象具有.count()方法,並且會返回匹配結果的計數。

[1]並非所有在'rom'中的'like'查詢都很慢,但那些速度較快的查詢需要使用非通配符前綴來將數據範圍限制爲掃描/過濾。

+0

非常感謝Josiah。 – user61629