Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Redis使用Python ORM ROM手动设置主键_Python 3.x_Redis_Orm_Redis Py - Fatal编程技术网

Python 3.x Redis使用Python ORM ROM手动设置主键

Python 3.x Redis使用Python ORM ROM手动设置主键,python-3.x,redis,orm,redis-py,Python 3.x,Redis,Orm,Redis Py,我正在尝试使用rompythonorm在Redis中存储对象 我有以下型号: import rom class Repository(rom.Model): id = rom.PrimaryKey() topics = rom.Json() 我想创建一个可以手动设置主键的实例,例如: repo = Repository() repo.id = 1337 repo.topics = ["topic1", "topic2"] 然而,当我尝

我正在尝试使用
rom
pythonorm在Redis中存储对象

我有以下型号:

import rom

class Repository(rom.Model):
    id = rom.PrimaryKey()
    topics = rom.Json()
我想创建一个可以手动设置主键的实例,例如:

repo = Repository()
repo.id = 1337
repo.topics = ["topic1", "topic2"]
然而,当我尝试这样做时,我得到以下错误:

回溯(最近一次呼叫最后一次): […]引发无效操作(“无法更新主键值”) rom.exceptions.InvalidOperation:无法更新主键值

基本上,我希望能够设置主键的值,以便在数据库中条目可以如下所示:

127.0.0.1:6379[1]> KEYS *
1) "Repository:243"
2) "Repository:1337"
3) "Repository:9001"
而不是:

127.0.0.1:6379[1]> KEYS *
1) "Repository:1"
2) "Repository:2"
3) "Repository:3"

是的,有一种方法,尽管不是像您所发现的那样默认。只要你使用整数,就有一点魔力可以让它发生

首先,这通常是不可能的,因为模型的元类强制主键,并强制在初始化时取消设置属性。但是,基于我承诺不会更改的内部和未记录的API(我也使用它),您可以:

def load_and_save_with_known_pk(model, data):
    """
    WARNING: will likely overwrite anything in Redis without a lock / check.
    WARNING: "data" may need to be encoded like how rom gets data out of
        Redis. It's probably something like: {"attr": json.dumps(<val>).encode(), ...}
    """
    # I am how rom loads models from Redis itself, wow!
    entity = model(_loading=True, **data)
    # this is how you make sure that the data is persisted
    entity.save(force=True)
def load_和_save_与_known_pk(型号、数据):
"""
警告:可能会在没有锁定/检查的情况下覆盖Redis中的任何内容。
警告:“数据”可能需要像rom从内存中获取数据那样进行编码
它可能类似于:{“attr”:json.dumps().encode(),…}
"""
#我是如何rom加载模型从Redis本身,哇!
实体=模型(加载=真,**数据)
#这就是确保数据持久化的方法
entity.save(force=True)
这里有两个内部钩子,如果您想绕过会话或其他内容,请通过
\uuuuu init\uuuu
方法查看所使用的内部参数: