阅读records

一、阅读背景

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对应的值
        "
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值