一个redis ORM

2019-06-09  本文已影响0人  ThomasYoungK

最近学习redis, 做个redis的ORM练练手:
只要我定义一个类,它的实例就可以直接操作redis:

class Article(PropsMixin):
    content = PropsItem('content', '')  # 字段名字, 默认值
    def __init__(self. id):
        self.id = id

假设现在操作id为10001的Article,可以这样:

article = Article(10001)
article.content  # 返回默认的空,因为还没有设置正文
article.content = '这是正文'  # 在数据库里面存了id为10001的Article的文本
article = Article(10001)
article.content  # 会返回Redis数据库存的正文内容
del article.content  # 删除对应数据库中id为10001的Article的文本
article.content  # 返回空

实现如下

import redis

redis_db = redis.StrictRedis(decode_responses=True)

class PropsMixin:
    @property
    def _props_db_key(self):
        return self.__class__.__name__ + ':' + str(self.id)

    def get_prop_item(self, name):
        return redis_db.hget(self._props_db_key, name)

    def set_prop_item(self, name, value):
        redis_db.hset(self._props_db_key, name, value)

    def del_prop_item(self, name):
        redis_db.hdel(self._props_db_key, name)


class PropsItem:

    def __init__(self, name, default=None):
        self.name = name
        self.default = default

    def __get__(self, instance, owner):
        r = instance.get_prop_item(self.name)
        if r is None:
            instance.set_prop_item(self.name, self.default or '')
            return self.default
        return r

    def __set__(self, instance, value):
        instance.set_prop_item(self.name, value)

    def __delete__(self, instance):
        instance.del_prop_item(self.name)
        self.default = None

上述代码非常容易理解

上一篇 下一篇

猜你喜欢

热点阅读