import copy
from core import argv
#import pymysql, sqlite3, pymssql ... # 动态加载:
def edb(key):
cfgs = config.init()
cdb = dict(copy.deepcopy(cfgs['cdb']), **cfgs[key])
return dbm(cdb)
class dbm:
def __init__(self, cfgs={}):
cfgs = cfgs if cfgs else argv.cfgs['cdb'] #g.cdb
self.cfgs = cfgs
self.dbcon()
def dbcur_comm(self, cfgs):
drive = __import__(cfgs['type'])
host = cfgs['host']; user = cfgs['user']; pwd = cfgs['pass']; name = cfgs['name']
self.con = drive.connect(host=host, user=user, password=pwd, database=name, charset="utf8")
self.cur = self.con.cursor(cursor=drive.cursors.DictCursor)
def dbcur_sqlite3(self, cfgs):
self.con = __import__('sqlite3').connect(cfgs['name'])
def cur_dict(cursor, row):
d = {}
for idx, col in enumerate(cursor.description):
d[col[0]] = row[idx]
return d
self.con.row_factory = cur_dict
self.cur = self.con.cursor()
def dbcon(self):
cfgs = self.cfgs
func = 'dbcur_' + cfgs['type']
if func in dir(self):
method = getattr(self, func)
method(cfgs)
else:
self.dbcur_comm(cfgs)
if not self.cur:
print('Database Error!')
#raise(NameError, "Database Error!")
def close(self):
self.cur.close()
self.con.close()
def table(self, tbname, sql=1):
pre = self.cfgs['tbpre']
fix = self.cfgs['tbfix']
if sql: # {base_catalog}
return tbname.replace('{', pre).replace('}', fix)
else:
return pre + tbname + fix
def get(self, sql, parms=(), re=None): # re = 1,n,None
cur = self.cur
cur.execute(self.table(sql), parms)
if not re:
res = cur.fetchall()
elif re==1:
res = cur.fetchone()
else:
res = cur.fetchmany(re)
return res
def exe(self, sql, parms=(), mod=None):
cur = self.cur
if type(parms) == list :
res = cur.executemany(self.table(sql), parms)
else:
res = cur.execute(self.table(sql), parms)
self.con.commit()
return res
def script(self, sql, parms=''):
self.exe(sql)
其中cdb 配置片段为:
[cdb]
type = pymysql
host = localhost
name = txext_main
port = 3306
user = peace
pass = 123456
tbpre =
tbfix = _ys
# type : pymysql, sqlite3, pymssql
# name : txmao_main,
# 127.0.0.1, localhost,
更多参考:微爬(Wepy)
http://imcat.txjia.com/chn.php?topic.2018-3j-g9b1