records包源码解析

records包是为了让人们更加方便的使用数据库的中的数据,简洁但强大。

使用

连接数据库

rows返回的是一个迭代器

也可以使用更加优雅的方式读取数据

或者是将数据全部取出来

rows还贴心的把数据变成字典

records包支持将数据导出成各种格式

源码解析

核心类有三个 Record, RecordCollection, Database。在做源码分析时,先从入口类Database开始:

Database类

Database类的核心是sqlalchemy框架,初始化时会根据给定的数据库url,调用create_engine方法,连接数据库。在Database还实现了__enter__和__exit__方法,以方便使用上下文管理器语法。Database类的核心方法是query,其他的query_file, bulk_query_file都是基于它做的。bulk_query 和 transaction 直接调用了sqlalchemy的excute和begin方法。

query方法中首先调用了execute返回一个游标cursor,再继而使用了Record和RecordCollection,构成了类似于迭代器的chain。

Record类

Record类使用cursor方法返回的key和value,也就是列名和相应的数据做进一步的处理。为了更方便的使用,Record类的__getitem__实现了序列协议,__getattr__实现了基于__getitem__实现了动态属性。

as_dict方法实现了元组到字典的转换,实现思路值得参考:

dataset使用了property装饰器将方法变成了属性,其中使用records包作者开发的tablib包,并且使用方法_reduce_datetimes将datetime类型转换成iso的字符串格式。同理将数据导出成json,csv等格式也是复用了tablib的代码。

RecordCollection类

RecordCollection类和Record类大部分方法相似,但是实现了__iter__和__next__的迭代器协议。这是为了尽量不一次性将数据读入内存,在需要的时候才进行计算。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181129G1DY6600?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券