umongo的数据存储框架实现

udatastore的Python项目详细描述


μDatastore:Google云数据存储的ODM

作为框架在μMongo库中实现(一个用于mongodb的python odm)

在使用Google云数据存储时,我们的大多数代码使用google-cloud-datastore包, 用于创建、更新和查询实体我们经常发现自己编写代码来导出对象 到datastore.Entity,并从实体导入到对象在AppEngine上,有ndb可以避免这一点, 因此,我们产生了自己为数据存储创建ODM的想法

在使用μmongo之前,我们创建了一个原型,它实现了一个基于 以下约定:

  • 数据存储分区(项目/命名空间)对应于Mongo数据库
  • 数据存储实体类型对应于mongo集合
  • 数据存储区__key__字段对应于mongo _id字段

安装

pip install udatastore

示例

fromdatetimeimportdatetimefromgoogle.cloudimportdatastorefromudatastoreimportDataStoreInstancefromumongoimportDocument,fields,validatedb=datastore.Client(project="dummy",namespace='abcd')instance=DataStoreInstance()instance.init(db)@instance.registerclassUser(Document):email=fields.EmailField(required=True,unique=True)birthday=fields.DateTimeField(validate=validate.Range(min=datetime(1900,1,1)))friends=fields.ListField(fields.ReferenceField("User"))goku=User(email='goku@sayen.com',birthday=datetime(1984,11,20))goku.commit()vegeta=User(email='vegeta@over9000.com',friends=[goku])vegeta.commit()vegeta.friends# <object umongo.data_objects.List([<object udatastore.reference.DataStoreReference(document=User, pk=<Key('User', 4476), project=dummy>)>])>vegeta.dump()# {'email': 'vegeta@over9000.com', 'id': '4477', 'friends': [<Key('User', 4476), project=dummy>]}User.find_one({"email":'goku@sayen.com'})# <object Document __main__.User({'email': 'goku@sayen.com', 'id': 4474,#                                 'friends': <object umongo.data_objects.List([])>,#                                 'birthday': datetime.datetime(1984, 11, 20, 0, 0)})>

限制:

并非μMongo的所有功能在μDatastore中都可用或工作完全相同:

  • 无索引
  • 我们目前不支持所有字段类型
  • 数据存储将任何datetime转换为UTC时区。目前,μDatastore重写此行为并始终与 不知道约会时间。
  • 我们带来了自己的ReferenceField实现。您可以使用umongo.fields.ReferenceField,作为DataStoreBuilder 将自动用我们的实现替换这些字段。我们还禁用了对引用字段的IO\U验证。 因为数据存储最终是一致的,所以在创建对以前创建的实体的引用时可能会报告错误

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
加密如何在Java中使用Skipjack(skip32)将数据库中的顺序整数随机化   java Android在两个活动之间传递数据获取NullPointerException   在构造函数中传递的java上下文显示错误   java将密钥添加到选定的密钥集   javascript为什么带有特殊字符的字符串在GET和POST方法中的行为不同?   java将反射。方法创建一个函数接口   设置Javasocket的端口   java通过一次按键调用MenuItem   java和引擎加载图形:为什么我的背景纹理很小,而且是颠倒的   如何将UV纹理从blender加载到opengl 安卓 java   跨Java虚拟机实现的jvm Java toString表示?   spring在Java服务器页面的上下文中这叫什么?