python与mysql交互详解二

主要实现从mysql数据库中取出想要的数据进行平均值计算,然后将取出的数据按特定字段分组后重新插入数据库中。复杂的问题可以先从简单点一步一步实现,拆解完成。

import pymysql
from pymysql import *
import pandas as pd

def select_data(sql, dict_data=True, host='xx',
                port=8088, database='stuDatas', user='root', password='xx'):
    try:
        if dict_data:
            conn = connect(host=host,
                           port=port,
                           database=database,
                           user=user,
                           password=password,
                           charset='utf8',
                           cursorclass=cursors.DictCursor,
                           )
        else:
            conn = connect(host=host,
                           port=port,
                           database=database,
                           user=user,
                           password=password,
                           charset='utf8',
                           # cursorclass=cursors.DictCursor,
                           )

        with conn.cursor() as cur:
            cur.execute(sql)
            results = cur.fetchall()
            conn.commit()
            return results
    except Exception as e:
        return e
 
def get_conn():
    conn = pymysql.connect(host='xxx', port=8088, user='root', passwd='xx', db='stuDatas', charset='utf8')
    return conn

def insert(cur, sql, args):
    cur.executemany(sql, args)
    
#将文件写入DB中        
def fileToDb(dataList,dbTableName):
    conn = get_conn()
    cur = conn.cursor()
    n = len(dataList[0])
    str_s = ','.join(['%s' for _ in range(n)])
    sql = 'insert into {}  values({})'.format(dbTableName,str_s)
      
    insert(cur, sql=sql, args=dataList)

    conn.commit()
    cur.close()
    conn.close()   
def get_insert(week):
    sql1 = '''select grade_code,subject_code,avg(exam_score),avg(fb_interaction_num),avg(knowledge_answer_num)
                ,avg(knowledge_num),avg(knowledge_score_rate),avg(tutor_ask_num)
                ,avg(zy_score_rate),avg(answer_right_rate),avg(class_right_rate),avg(selflearning_true_rate)
              from studentDatas
              where week = "{}" 
              group by grade_code,subject_code '''
    sql1 = sql1.format(week)
    #print(sql1)
    data = select_data(sql1)
    #print(data)
    df = pd.DataFrame(data,index=None)
    df.columns = ['ave_answer_right_rate','ave_class_right_rate','ave_exam_score','ave_fb_interaction_num','ave_knowledge_answer_num','ave_knowledge_num','ave_knowledge_score_rate','ave_selflearning_true_rate','ave_tutor_ask_num','ave_zy_score_rate','grade_code','subject_code']
    #df.head(5)
    ##将df中的Nan替换成none
    #df = df.where(df.notnull(), None)
    #将df格式的数据转化为list格式
    dataList = df.values.tolist()
    #####  注意 表不能加主键 另外df文件有列名,表中也要对应写好列名
    fileToDb(dataList,'stu_in_teacher_ave_fin')

单条数据测试:

sql1 = '''select grade_code,subject_code,avg(exam_score),avg(fb_interaction_num),avg(knowledge_answer_num)
                ,avg(knowledge_num),avg(knowledge_score_rate),avg(tutor_ask_num)
                ,avg(zy_score_rate),avg(answer_right_rate),avg(class_right_rate),avg(selflearning_true_rate)
              from studentDatas
              where week = '2018-31'
              group by grade_code,subject_code '''
data = select_data(sql1)
df = pd.DataFrame(data,index=None)
df.head(5)

取出周列表

sql0 = 'select distinct(week) from studentDatas'
dataweek = select_data(sql0)
dfweek = pd.DataFrame(dataweek,index=None)
weekList = dfweek.values.tolist()

循环遍历周然后查找出来插入进去

for week in weekList:   
    get_insert(week[0])

猜你喜欢

转载自blog.csdn.net/cayman_2015/article/details/83624543
今日推荐