lib/dbi/_dbi.py


# encoding: utf-8


from contextlib import closing

DEFAULTBUFFERSIZE = 8192

class _Buffer(object):
    ''' 提供简化的缓冲批量处理方式 '''
    def __init__(self, sql, size=DEFAULTBUFFERSIZE):
        ''' 初始化时指定缓冲操作SQL '''
        self.sql = sql
        self.size = size
        self.data = []

    def connect(self, conn):
        ''' 绑定数据库连接 '''
        self.conn = conn


    def flush(self):
        ''' flush self's buffer '''
        buffer, self.data = self.data[:], []
        with closing(self.conn.cursor()) as curr:
            curr.executemany(self.sql, buffer)
            self.conn.commit()
           
    def append(self, o):
        ''' 向缓冲中添加数据 '''
        self.data.append(o)
        if len(self.data) >= self.size:
            self.flush()

    def __lshift__(self, o):
         ''' 重载 << 操作符于append方法 '''
         self.append(o)

    def close(self):
        ''' 完成关闭 '''
        self.flush()


class _DBI(object):

    def __init__(self, **kwg):
        ''' 初始化时指定参数 '''
        self.setting = dict(kwg)
        self.conn = None


    def open(self):
        ''' 用专有的驱动程序依据初始化参数创建数据库连接 '''
        if not self.conn:
            #~ self.conn = ..(**self.setting)
            pass
        return

    def close(self):
         ''' 关闭连接 '''
        self.conn.close()
        self.conn = None

    def __enter__(self):
        ''' 正文模式的进入处理 '''
        self.open()
        return self

    def __exit__(self, *args):
        ''' 正文模式的退出处理 '''
        self.close()
        return


    def execute(self, sql, *args):
        ''' 执行给定的SQL, 并传入给定的参数 '''
        with closing(self.conn.cursor()) as curr:
            curr.execute(sql, args)
            self.conn.commit()

    def query(self, sql, *args, **kwg):
        ''' 按指定的SQL及参数查询, 
        命名参数中可以指定rowfactory='dict'要求以字典形式返回查询结果,
        或以其提供的方法代入查询结果的列名-值, 生产指定的对象实例,
        显示指定rowfactory或以默认的形式, 将直接返回查询结果集中的元组'''
        setting = dict(kwg)
        rowfactory = setting.get('rowfactory','row')
        with closing(self.conn.cursor()) as curr:
            curr.execute(sql, args)
            fields = [f[0] for f in curr.description]
            for r in curr:
                if rowfactory == 'row':
                    yield r
               elif rowfactory == 'dict':
                    yield dict(map(None, fields, r))
               else:
                    yield rowfactory(**dict(map(None, fields, r)))


    def bindBuffer(self, buffer):
        ''' 绑定一个已经定义了的_Buffer实例 '''
        self.buffer = buffer
        buffer.connect(self.conn)


    def initBuffer(self, sql, size=DEFAULTBUFFERSIZE):
        ''' 指定SQL, 初始化一个被绑定的_Buffer '''

        self.bindBuffer(_Buffer(sql, size))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值