用于将类似nosql的数据保存到各种后端的工具。

oxtie的Python项目详细描述


简介

python oxtie 包是一个通过 将数据保存并加载到各种后端(特别是 云)它适合于低级序列化/反序列化之上的某个地方 pickle、json、msgpack等工具,但在 像postgres或mongodb这样的数据库。

oxtie的目标是成为一个轻量级的加载/保存系统 以后端不可知的方式提供数据。

安装

您可以通过类似于

$ pip install oxtie

示例用法

oxtie试图回答的主要问题是"我应该在哪个后端 用于以简单高效的方式存储我的python对象?"。这个 答案是"你不必选择;使用Oxtie,你可以很容易地改变 您喜欢的后端。"

最简单的例子

作为一个如何使用oxtie的简单示例,请考虑以下内容 例子:

>>>fromoxtie.backsimportsimple# Import some simple backends>>>tfbackend=simple.TempFileBackend()# Choose a temp file backend>>>fromoxtie.frontsimportbase# Import front ends>>>classMyClass(base.Frontend):# Define your own class...'Simple sub-class of Frontend so it can save data'...>>>f=MyClass(facets={'my_name':'test_item'},backend=tfbackend)>>>f.arbitrary_data='you can set whatever data you want'>>>f.save()# Backend will save

只需从base.frontend继承并选择后端,就可以 调用对象的save方法,它将在 所需的后端。您可以使用s3、文件系统或任何其他 只需更改一行即可支持后端。

以后可以通过以下方式加载对象:

>>>g=tfbackend.load({'my_name':'test_item'},front_cls=MyClass)>>>f.arbitrary_data==g.arbitrary_dataTrue

oxtie 用来保存/加载的关键是 facets 字典。 默认情况下, facets 中不以下划线开头的所有键 已使用,但您可以按后面的说明自定义此项。

另一个例子

您可以使用 oxtie 来处理复杂的数据结构。到 举例来说,假设您想以某种方式保存pandas数据帧。 首先,您要做的通常事情是导入熊猫并创建 数据帧:

>>>importpandas# So we can make a dataframe.>>>data={'estimate':[.17,None]}# Make example data>>>frame=pandas.DataFrame(data,index=['2017-07-01','2017-10-01'])

接下来,您可以从 oxtie 通过某种方式将数据帧存储为临时文件 喜欢:

>>>fromoxtie.frontsimportspecials# Illustrate special example>>>fromoxtie.backsimportsimple# Import simple backends>>>backend=simple.TempFileBackend()# Choose a temp file backend>>>f=specials.nums.SimpleFrame({'name':'test'},backend=backend,frame=frame)>>>f.arbitrary='You can also save arbitrary data in SimpleFrame'>>>f.save()# Now save the frame.

你本可以做些 从oxtie.backs导入aws以获取不同的后端并使用 backend= aws.s3backend('prefix', 'bucket') 保存到amazon s3。或 如果你喜欢发电机,你可以用 后端=aws.dynamobackend(表名, 键字段={'primary':['name']}) 用主键将数据保存到表中 primary 改为从 name 方面构建。关键是 oxtie 处理不同的后端,因此您没有 担心它或更改代码(除了选择后端 当然)。

继续我们的例子,一旦你想加载你的数据,你可以 以下(可能在另一个python会话中):

>>>g=backend.load({'name':'test'},allow_load=True)>>>g.__class__.__name__'SimpleFrame'>>>g.frame.to_csv()==f.frame.to_csv()# Compare CSVs to handle NonesTrue>>>g.arbitrary==f.arbitrary# Aribitrary properties also matchTrue

注意,在上面的示例中,我们提供了 allow_load=true 指示 后端可以动态地找出哪些python类 将数据加载到。如果你不喜欢动态加载,有 指定要加载到其中的类的各种方法。

为什么是前端?

你可能想知道为什么我们需要像 简单名称 。如果你真的想,你可以用 后端本身是pickle或 数据库对象关系管理器(ORM)的更有限版本。在 不过,一般来说,有一个后端协议和一个 前端类,这样你可以更聪明地做 控制序列化/反序列化、处理标题等。

作为一个非常简单的例子,您可以修改前面的例子 通过

>>>facets=f.get_facets_dict()>>>facets['_timezone']='US/Eastern'>>>f.save()

f.get_facets_dict()返回的字典用作头 存储简单的"facet"(facet类似于"attribute",但我们使用 别字以免混淆使用python的se oxtie"facets" "属性")。这些特殊的方面比通常的有一个优点 python属性是您可以执行类似的操作。

>>>h=backend.load({'name':'test'},only_hdr=True)>>>print('name:tz = %s:%s'%(...h['_facets']['name'],h['_facets']['_timezone']))name:tz=test:US/Eastern

在上面,我们使用 only_hdr=true 选项来 后端。 首先只加载标题。这通常是一个更便宜和更快的 操作,而不是反序列化和加载完整对象。其中之一 这个头字典包含一个包含 由 get_facets_dict() 提供的字典。因此,我们可以 查看标题以查看时区并执行如下操作:

  1. 对于时区错误的对象,跳过满载。
  2. 反序列化的方式不同,具体取决于方面中的内容,如 时区。

实际上, simpleframe 类就是这样做的。如果你装满了 对象并打印帧,您将看到,尽管我们保存了一个熊猫 没有时区信息的数据帧,类看起来 对于facets中的 "时区" ,并适当地本地化 装载量:

>>> print(backend.load({'name': 'test'},allow_load=True).frame.index[0])
2017-07-01 00:00:00-04:00

主要功能

oxtie 包旨在简化数据的加载和保存 具有以下主要功能的不同后端:

  1. 内置 oxtie 后端可以轻松地将数据存储到本地 数据库、本地文件、amazon s3、amazon dynamodb和其他云 提供者。
  2. 支持序列化和存储熊猫数据帧对象。
  3. 能够轻松实现自己的后端存储以保存/加载 到/从。
  4. 能够将后端与序列化分离。
    • 您可能希望以json、bson、msgpack等格式序列化。 csv、pickle等,但 存储在后端,如本地文件、s3, 等等。使用oxtie,您可以随心所欲地进行混合和匹配。
  5. 能够在加载 完整的对象,以便您可以廉价地扫描存储的数据 加载什么/如何加载。
  6. 能够构建智能前端进行验证或其他 加载或保存操作。

这些功能可能看起来有些标准和通用,因此可能值得 强调对创建"oxtie"影响最大的一个:快速 加载/扫描头信息。在现代主要数据系统的模型中 许多组织都希望做好三件事:

  1. 保存数据。
  2. 获取您知道密钥的数据。
  3. 根据一些简单的搜索条件查找密钥。

在早期,sql数据库很好地实现了3。你可以 编写任意复杂的查询,让您可以使用 查找要加载的数据的条件。后来人们发现你 通常有不需要搜索的二进制大对象(blob) 加上你想搜索的标题信息。这导致了NoSQL 以更有限的代价大大提高性能的数据库 搜索条件。自从nosql成功以来,云存储移动了很多东西 更进一步提供更为有限的搜索能力(如亚马逊 S3或Amazon Dynamodb)。

在许多云存储系统中,您可以有效地将数据分为 一些简单的头信息或方面,如名称或上次更新 时间或区域以及不可搜索的数据。你的存储和 搜索操作本质上只涉及标题,因此 效率高。

假设你订阅这个小标题+大正文的范例,你可以 开始意识到简单的保存/加载/扫描方法在 有很多不同的系统,为什么要硬编码应用程序 依赖于特定的后端?答案是你不应该!使用 牛津大学!

理想情况下,人们甚至可以更进一步地定义一种简单的语言 用于搜索加载扫描(SLS)操作的独立协议,类似于 可以是imp的sql标准有多种语言的柠檬味。用 一个SLS标准,你可以灵活地保存像熊猫这样的东西 从python到s3(或其他后端)的数据帧,然后加载到 在其他语言的适当结构中。牛津大学 打包是这条道路上的第一步。

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

推荐PyPI第三方库


热门话题
如何为纯Java应用程序启用ProGuard缩小?   java决定在GitHub上上载哪些文件   java如何编写SQL查询以从两个表中获取数据   java无法初始化类org。springframework。aop。框架DefaultAOpproxy工厂   如何在安卓中将kotlin集转换为java   更改程序中的java字符串、子字符串和ifelse语句   java Spring自动添加“XTotalCount”头   在Java中获取日期范围内的所有星期五   javafx滚动窗格不允许请求聚焦于某个字段   java如何在并行flux内的同一线程中运行mono   线程“main”java中的安装启动4j异常。lang.NoClassDefFoundError:javax/mail/MessaginException   java从GWT CellTable获取所有对象   java按钮视图即使在将其可见性设置为true后也不可见   java Spring 3.0处理文件上载问题   java Chromedriver元素在点(xxx,yyy)处不可单击。其他元素将收到单击:   java系统。加载抛出NoSuchMethodError   在Java中打开文件时出错   java子类何时以及为什么要声明父类的静态实例成员?