Skip to content
Advertisement

How to create a column and set key and value to redis using Python

I have been trying to figure out how I can set key and value to a specific column. By column I mean something like:

"fruit": {
    "american" {
        "key": "value",
        "key2": "value2"
    },
    "europe" {
        "key": "value"
        "key2": "value2"
    }
},

"books": {
    "american_author" {
        "key": "value"
        "key2": "value2"
    },
    "asia_author" {
        "key": "value"
        "key2": "value2"
    }
},

"paint": {
    "africa" {
        "key": "value"
        "key2": "value2"
    },
    "south_america" {
        "key": "value"
        "key2": "value2"
    }
}

What im trying to achieve here is that I would like to be able to add a new “column” which is fruit, book and paint and inside those values I would like to add another “column” and inside each column I want to add keys and values. As you can see in the snippet above.

For now I have done something like this:

import serialized_redis

r = serialized_redis.JSONSerializedRedis(host='localhost', port=6379, db=0)
r.set('fruit', 'american', {'key': 'value' })

but what returns:

    raise DataError("Invalid input of type: '%s'. Convert to a "
redis.exceptions.DataError: Invalid input of type: 'dict'. Convert to a bytes, string, int or float first.

My question is, am I able to do it using Redis and if so, how can I be able to add the keys and values to a specific “column” as given at the top of the thread?

Advertisement

Answer

You can encode the nested JSON part as a string as use Redis Hash

For example, ‘fruit’, ‘books’, ‘paint’ , etc can be a redis hash, ‘american’, ‘europe’, etc can be the key of the hash and ‘key’, ‘key2’ can be stored as value of the key as JSON string. Like the following:

redisClient = redis.Redis(host='localhost', port=6379, db=0)

# your application logic to form the json
american_json = {"key": "value", "key2": "value2"}
europe_json = {"key": "value", "key2": "value2"}

# hash name: fruit; # hash-key1: american; #value of hash-key1: JSON as string
redisClient.hset("fruit", "american", json.dumps(american_json))    
redisClient.hset("fruit", "europe", json.dumps(europe_json))

If at this point you check redis:

127.0.0.1:6379> hgetall fruit
1) "american"
2) "{"key": "value", "key2": "value2"}"
3) "europe"
4) "{"key": "value", "key2": "value2"}"

Further code logic to add new fields:

# say you have to add another key-value in the key "american" for the hash "fruit"
#first we get the key stored in redis

fruit_american_json_string = redisClient.hget("fruit", "american")

#then we convert the retrieved string to JSON
JSON_object = json.loads(fruit_american_json_string)

#add your new key
JSON_object["key3"] = "value3"

#write the new JSON as string in Redis
redisClient.hset("fruit", "american", json.dumps(JSON_object))

Final output in redis:

127.0.0.1:6379> hgetall fruit
1) "american"
2) "{"key": "value", "key2": "value2", "key3": "value3"}"
3) "europe"
4) "{"key": "value", "key2": "value2"}"
User contributions licensed under: CC BY-SA
6 People found this is helpful
Advertisement