lib/dbi/_dbi.py

来源:互联网 发布:本地端口怎么开启 编辑:程序博客网 时间:2024/05/17 01:57


# 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))

原创粉丝点击