一个基于键/值的json odm,有一个令人难忘的名字。
caroline的Python项目详细描述
卡罗琳
一个键值json odm,具有一个令人难忘的名称。
卡罗琳是什么?
caroline是另一种存储json数据的方法。它包含ElasticSearch和Redis的后端,允许您在同一个项目中同时使用它们!包含在框中(强烈建议您使用)的是jsonschema支持。
为什么?
现有的选项对于我们所寻找的不是很有效,所以我们为内部使用编写了自己的选项,并决定开放源代码。该项目的目标是易于集成而无需高开销。
它是如何工作的?
开始的唯一需要做的事情就是from caroline import Prototype
。然后您可以开始构建数据类:
fromcarolineimportPrototypeclassDog(Prototype):default={"breed":"","age":1,"name":""}schema={"type":"object","properties":{"breed":{"type":"string"},"age":{"type":"number"},"name":{"type":"string"}}}sam=Dog('sam')print(sam)# >>> {"breed": "", "age": 1, "name": ""}sam.update('name','Sam')# ORsam['name']='Sam'sam.update('age',5)sam.update('breed','mutt')sam.save()
当您使用id(如Dog('sam')
)创建类的新实例时,这是保存特定记录的键。这意味着,如果使用该名称创建一个类,它将再次加载相同的记录:
fromexample_aboveimportDogx=Dog('sam')print(x)# >>> {'breed': 'mutt', 'age': 5, 'name': 'Sam'}
如果使用所选数据库中不存在的id创建类的实例,则它将使用在类中定义的default
dict实例化该实例。
Caroline将自动处理自己的连接,但如果您有自定义连接,请随时通过您的型号将其传入:
classCat(Prototype):elasticsearch_conn=your_elasticsearch_connection# ORredis_conn=your_redis_connectiondefault={}
注意:您的模型上不能有多个连接!每个模型只能与一个数据库一起工作;也就是说,如果您愿意的话,可以将每个模型路由到不同的数据库,而caroline可以为您处理它。如果您不想传递每个模型的特定连接,我们不会责怪您;默认连接是elasticsearch,但是您可以通过将环境变量CAROLINE_DEFAULT_DB
设置为“elasticsearch”或“redis”来更改它。您还可以直接导入caroline配置并手动将请求的数据库设置为默认值(caroline.config.default_db = "redis"
)。
目前还没有更改elasticsearch位置的方法,但是可以通过将redis地址格式化为url(例如redis://localhost:6379/0
)来设置redis位置,如果将其设置为环境变量CAROLINE_REDIS_URL
,caroline将获取该地址。
如果时间继续,你需要升级你的模型,我们有一个计划!只需修改模型(添加或删除新字段),然后按正常方式加载关键点。在数据库中检索到的对象调用“{{ CD8}}”,卡洛琳将强制您现有的数据进入新模型。这是一个破坏性的呼吁。
fromcarolineimportPrototypeclassDog(Prototype):default={"age":1,"name":"","sire":"","dam":""}db='redis'x=Dog('sam')print(x)# we get the last time we used the key `sam` for the prototype class `Dog`# >>> {'breed': 'mutt', 'age': 5, 'name': 'Sam'}# THIS CALL RESULTS IN THE DESTRUCTION OF DATAx.upgrade()print(x)# >>> {'age': 5, 'name': 'Sam', 'sire': '', 'dam': ''}x.save()
caroline还使您能够选择数据库根键名称;默认情况下,它将是您创建的类模型的名称。例如,如果您有一个名为dog的类,上面的记录id为'sam',那么db中的记录将具有::dog::sam
键。您可以通过添加另一个参数来调整第一部分:db_key
。除非你有充分的理由改变它,否则不要为此烦恼。
关于模式的说明:虽然我们提供了对jsonschema的支持(这是创建这个包的驱动力),但您不必使用它——如上面的示例所示,您不需要创建schema
键。如果没有传入schema
,则它不会对.save()
执行验证步骤,否则,它会在每次调用.save()
时根据架构验证数据。
最后,有时您只需要一个dict;我们的原型类在假装dict方面做得很好,但是如果您真的只需要数据,则调用.to_dict()
并返回一个常规字典。