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