一、阅读背景
records的作者也是Kenneth Reitz,代码538行,records地址。
二、阅读介绍
进入项目的github首页,可以看到”Records is a very simple, but powerful, library for making raw SQL queries to most relational databases.“这句话,百度翻译过来时”Records是一个非常简单但功能强大的库,用于对大多数关系数据库进行原始SQL查询。“
三、导入模块信息
import os # 与操作系统交互的模块
from sys import stdout # 向控制台输出
from collections import OrderedDict # 内置有序字典类
from contextlib import contextmanager #contextlib上下文管理模块。任何对象只要实现了上下文管理协议都可以使用with语法,contextmanager装饰器为函数提供上下文管理机制
from inspect import isclass # inspec模块用于收集python对象信息,可以获取类或函数的参数的信息
import tablib # 是一个格式未知的表格操作库,支持excel,json,yaml,html,csv的导入/导出,修改操作
from docopt import docopt
from sqlalchemy import create_engine, exc, inspect, text
异常类判断函数
def isexception(obj):
"""Given an object, return a boolean indicating whether it is an instance
or subclass of :py:class:`Exception`.
输入一个对象,根据对象是不是Exception类的实例或子类返回布尔值
"""
if isinstance(obj, Exception): # 对象是Exception的实例则返回True
return True
if isclass(obj) and issubclass(obj, Exception): # 对象是Exception的子类返回True,否则False
return True
return False
Record类
用于存储从数据库中查询出来的一行一行的数据
class Record(object): # Recoed类
"""A row, from a query, from a database."""
__slots__ = ('_keys', '_values') # __slots__节省内存的魔法方式,同时也会限制类的属性
def __init__(self, keys, values): # 初始化类,为类添加两个属性_keys和_values,这两个属性为私有属性
self._keys = keys
self._values = values
# Ensure that lengths match properly.
assert len(self._keys) == len(self._values) # 断言声明其布尔值必须为真,否则抛出错误,这里是确保self._keys和self._values长度相等
def keys(self): # 返回查询得到的列名list
"""Returns the list of column names from the query."""
return self._keys
def values(self): # 返回查询得到的值list
"""Returns the list of values from the query."""
return self._values
def __repr__(self): # 字符串表达形式,同__str__
return '<Record {}>'.format(self.export('json')[1:-1])
def __getitem__(self, key):
# Support for index-based lookup.支持基于索引的查找
if isinstance(key, int): # key为整数则返回值list在key位置的值
return self.values()[key]
# Support for string-based lookup.支持基于字符串的查找
if key in self.keys(): # key在列名list里,则找出key所在的位置索引,再返回值list对应位置的值
i = self.keys().index(key)
if self.keys().count(key) > 1: # 如果key在列名list中存在多个,则抛出错误
raise KeyError("Record contains multiple '{}' fields.".format(key))
return self.values()[i]
raise KeyError("Record contains no '{}' field.".format(key)) # 不满足基于索引的查找,也不满足基于字符串的茶渣则抛出错误
def __getattr__(self, key): # 获取属性值
try:
return self[key]
except KeyError as e:
raise AttributeError(e)
def __dir__(self): # dir()函数列出对象或类中的属性
standard = dir(super(Record, self)) # super()函数是调用父类的一个方法,此处将父类的属性赋值给standard
# Merge standard attrs with generated ones (from column names).
return sorted(standard + [str(k) for k in self.keys()]) # 将父类的属性和自身的属性放在同一个列表中排序后返回
def get(self, key, default=None): # 返回 key对应的值
"