2015-07-21 4 views
0

Я работаю с флягой и redis. Я решил попробовать rom 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 будет иметь список объектов. Что я делаю не так? (Я фильтровал «.», Потому что я понял, что URL-адреса будут иметь его)

ответ

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] Не все «похожие» запросы в ром медленны, но те, для которых требуется быстрый доступ, требуют несимметричных префиксов для ограничения диапазонов данных для сканирования/фильтрации.

+0

Большое спасибо Иосии. – user61629

Смежные вопросы