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__的迭代器协议。这是为了尽量不一次性将数据读入内存,在需要的时候才进行计算。