Сопоставление Redis-py hset() — TypeError при установке нескольких значений элемента

Я создаю несколько очень больших таблиц поиска в Redis. У меня есть простой код, который работает, как и предполагалось, при циклическом обходе dict, чтобы установить одно значение в моем хэше Redis (через конвейер) для каждого элемента с использованием hset():

foo = {"1234": "5678", "abcd": "efgh", ... }

with self.db.pipeline() as pipe:
    for foo in bar:
        pipe.hset("lookup_table", foo["key"], foo["value"])
pipe.execute()

Это медленно с большим словарем. Чтобы ускорить его, я хочу иметь возможность устанавливать несколько элементов в качестве сопоставления с конвейером, не зацикливаясь на нем. Теперь, когда hmset() устарел, кажется, что hset() может принимать сопоставление через ключевое слово arg. Я попытался сделать следующее:

with self.db.pipeline() as pipe:    
    pipe.hset("lookup_table", mapping=foo)
pipe.execute()

но это дает ошибку TypeError: hset() got an unexpected keyword argument 'mapping'. Я неправильно использую hset()? Или я ошибаюсь, думая, что hset() может принимать несколько предметов таким образом?

Я использую py-redis 3.4.1 с Python 3.7.5.


person Harry    schedule 10.04.2020    source источник


Ответы (2)


Это известная проблема, как показано здесь --> https://github.com/andymccurdy/redis-py/issues/1310#issuecomment-603081122.

Как вы можете видеть на этом изображении, исходный код в PyPi имеет hset с сигнатурой функции, которая не содержит ключевого слова mapping. Вы должны убедиться, что в вашей установке py-redis присутствует та же проблема, и также следовать этому билету. Чтобы обойти это, вы можете клонировать прямо из ветки master, чтобы использовать эту функцию.

person gold_cy    schedule 10.04.2020
comment
Спасибо, я просмотрел исходный код на Github и увидел, что он присутствует в 3.4.1 и что у меня была установлена ​​3.4.1 через pip, поэтому я подумал, что это код, который я использую. Установка из репозитория Github решила проблему (и это действительно намного быстрее). - person Harry; 10.04.2020

Обновление с

pip install -U redis

решил проблему для меня.

person CGFoX    schedule 16.02.2021