在数据剖析师实际的工作过程中,取数和数据处理占有了很大一部门工作量,取数一样是从各个数据库提取,数据处理一样是使用pandas,好在pandas供应了保持数据库的接口,然则,频仍的保持和封闭数据库很影响数据库的机能,导致查询过慢。为此,我测验构建数据库保持池,每次保持数据库只需要从保持池中掏出一条保持,用完之后再放归去,并不是真正的保持数据库和封闭数据库。同时,我也测验把取数过程封装成方式,供直接挪用,下面所有代码拿到你的机械上都能够直接运行:
第一步、建立设置文件 config.pytest_mysql = {
'host': '127.0.0.1',
'port': 3306,
'user': 'root',
'pass_word': 'root',
'db': 'wangzhe'
}
这里面首要存储数据库设置信息;第二步、使用pymysql构建数据库保持池 dbpools.pyimport pymysql
from DBUtils.PooledDB import PooledDB
class OPMysql(object):
__pool = None
def __init__(self):
pass
def get_mysqlconn(self, host, user, pass_word, port, db):
\"\"\"
构建数据库保持池
:return: 数据库保持
\"\"\"
if OPMysql.__pool is None:
__pool = PooledDB(creator=pymysql, mincached=1, maxcached=20,
host=host,
user=user,
passwd=pass_word,
db=db,
port=port,
charset='utf8')
print(__pool)
return __pool.connection()
def dispose(self):
self.cur.close()
self.coon.close()
第三步、构建数据获取文件 mysqlhelp.pyimport sys
import os
import pandas as pd
from config import config
from utils.dbpools import OPMysql
DB = config.test_mysql
host = DB['host']
port = DB['port']
user = DB['user']
pass_word = DB['pass_word']
db = DB['db']
class MysqlHelp(object):
def __init__(self, host=host, port=port, user=user, pass_word=pass_word, db=db, charset=\"utf8\", read_timeout=7200):
self.host = host
self.port = port
self.user = user
self.pass_word = pass_word
self.db = db
self.charset = charset
self.read_timeout = read_timeout
self.db_instance = OPMysql()
def get_conn(self):
conn = self.db_instance.get_mysqlconn(host=self.host, user=self.user, pass_word=self.pass_word, port=self.port,
db=self.db)
return conn
def close_conn(self, conn, cursor=None):
if cursor is not None:
cursor.close()
conn.close()
print('数据库封闭')
def get_df(self, *args):
dfs = []
conn = self.get_conn()
for i, sql in enumerate(args):
df = pd.read_sql(sql, conn)
dfs.append(df)
self.close_conn(conn)
return dfs if len(dfs) > 1 else dfs[0]
实例
接着我们来使用一下看看,保持内陆数据库,获取hero表中的数据,并转换为dataframefrom utils.mysqlhelp import MysqlHelp
from config import config
mysql_help = MysqlHelp(**config.test_mysql)
sql = '''
select * from heros
'''
df = mysql_help.get_df(sql)
print(df.head())
能够看到,数据输出成功,今后想要获取数据库中的数据,写完sql直接挪用写好的方式就能够了,后背还能够把获取到的数据主动作为邮件附件发送,我们下次再说,敬请等候!