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
方法查看所使用的内部参数: