首页 > 数据库 >Python实战:从数据库到Excel的复杂查询结果处理【上】

Python实战:从数据库到Excel的复杂查询结果处理【上】

时间:2023-12-26 18:33:45浏览次数:33  
标签:__ sheet Python list 数据库 excel Excel id col

一、背景

年底了,运营同学要做报告,于是来找我要数据,而数据来源于MySQL数据库的两个表,两个表中的数据无法一一对应,数据未能通过SQL直接查询出来,需要将表1中的查询结果传参到表2的查询SQL的条件中。数据量较大,若将查询结果复制到excel中,之后再去一一手动匹配的话,这工作量也是巨大的。于是尝试使用Python来实现

二、实现步骤

数据库查询操作

使用pymysql库连接Mysql数据库查询数据,若是初次使用,需要安装后再导入

pip install pymysql

连接数据库查询示例代码如下:

from pprint import pprint

import pymysql


def select_from_mysql(dbinfo, sql):
    """
    连接数据库执行sql
    """
    conn = pymysql.connect(**dbinfo)
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    cursor.execute(sql)
    results = cursor.fetchall()
    conn.close()
    return results


if __name__ == "__main__":
    # 数据库信息
    db_info = {
        'host': "192.168.1.1",
        'port': 3306,
        'user': "test",
        'passwd': "test",
        'db': "test_db",
        'charset': "utf8"
    }
    sql = "select * from test_table;"
    r = select_from_mysql(db_info, sql)
    pprint(r)

运行效果:

Python实战:从数据库到Excel的复杂查询结果处理【上】_mysql

写入表格表头

使用xlwt模块操作excel,若未使用过xlwt,需要先安装导入

pip install 

写入表头示例代码:

import xlwt


def to_excel():
    # 定义表头
    headers = ['主业务id', '次业务id', '会员id', '是否完成', '进入时间', '分值', '是否重复操作', '重复操作次数', '是否首次操作', '失败次数', '总时长']
    # 新建工作簿和工作表
    book = xlwt.Workbook(encoding='utf-8')  # 新建工作簿
    sheet = book.add_sheet("new_sheet", cell_overwrite_ok=True)  # 新建sheet
    # 写入表头
    for col, val in enumerate(headers):
        sheet.write(0, col, val)
    # 保存excel
    book.save("test1.xlsx")


if __name__ == "__main__":
    to_excel()


Python实战:从数据库到Excel的复杂查询结果处理【上】_mysql_02

写入表格内容

从表1中查询数据,批量写入excel,根据指定的条件,从表2中查询数据,批量写入excel

import pymysql
import xlwt


def select_from_mysql(dbinfo, sql):
    """
    连接数据库执行sql
    """
    conn = pymysql.connect(**dbinfo)
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    cursor.execute(sql)
    results = cursor.fetchall()
    conn.close()
    return results


def to_excel(dbinfo):
    # 定义表头
    headers = ['主业务id', '次业务id', '会员id', '是否完成', '进入时间', '分值', '是否重复操作', '重复操作次数', '是否首次操作', '失败次数', '总时长']
    # 新建工作簿和工作表
    book = xlwt.Workbook(encoding='utf-8')  # 新建工作簿
    sheet = book.add_sheet("new_sheet", cell_overwrite_ok=True)  # 新建sheet
    # 写入表头
    for col, val in enumerate(headers):
        sheet.write(0, col, val)

    # 查询表1的数据
    a_ids = "197715879100678144,174809847437459456"
    # sql1 = "select activity_ident,mission_ident,member_id,success,created_at,point,(case when reply_count>0 then 1 " \
    #        "else 0 end) as is_replay, reply_count,failure_before_success_count,total_failure_count from " \
    #        f"activity_stat_member_activity where activity_ident in ({a_ids}) and member_id={103755}; "
    sql1 = f"select * from table1 where a_id in ({a_ids}) and m_id={100001}"
    results1 = select_from_mysql(dbinfo, sql1)

    # 根据表1查询结果查询并组装表2的数据
    if results1 is not None:
        for i, v in enumerate(results1):
            r1_k_list = [key for key in v]
            for col, k in enumerate(v):
                if col == 1:
                    sheet.write(i + 1, col, v[r1_k_list[col]])
                    # 查询表2的数据
                    # sql2 = "select sum(t1.time) sum_time,t1.mis_id from (select round(max(created_at)-min(created_at)) " \
                    #        "time,max(mission_ident) mis_id from activity_member_mission_node_record where activity_ident " \
                    #        f"={v[r1_k_list[0]]} and mission_ident={v[r1_k_list[col]]} and member_id={103755} " \
                    #        "group by mission_record_ident) t1 group by t1.mis_id;"
                    sql2 = f"select * from table2 where a_id={v[r1_k_list[0]]} and mi_id={v[r1_k_list[col]]} and m_id={100001}"
                    results2 = select_from_mysql(dbinfo, sql2)
                    if results2 != ():
                        r2_k_list = [key for key in results2[0]]
                        sheet.write(i + 1, 10, results2[0][r2_k_list[0]])
                        sheet.write(i + 1, 11, results2[0][r2_k_list[1]])
                elif col in [3, 6]:
                    if v[r1_k_list[col]] == 1:
                        sheet.write(i + 1, col, '是')
                    else:
                        sheet.write(i + 1, col, '否')
                elif col == 8:
                    if v[r1_k_list[3]] == 1 and v[r1_k_list[col]] == 0:
                        sheet.write(i + 1, col, '是')
                    else:
                        sheet.write(i + 1, col, '否')
                else:
                    sheet.write(i + 1, col, v[r1_k_list[col]])
    # 保存excel
    book.save("test1.xlsx")


if __name__ == "__main__":
    # 数据库信息
    db_info = {
        'host': "192.168.1.1",
        'port': 3306,
        'user': "test",
        'passwd': "test",
        'db': "test_db",
        'charset': "utf8"
    }
    to_excel(db_info)

运行效果:

Python实战:从数据库到Excel的复杂查询结果处理【上】_sql_03

三、总结

从最后的运行结果来看,已经可以成功根据指定条件将数据批量写入到excel中,但是发现excel中的数据展示并不正常,这是接下来我们要解决的问题

1.写入到excel中数据格式问题

2.excel表格样式问题


标签:__,sheet,Python,list,数据库,excel,Excel,id,col
From: https://blog.51cto.com/u_16379005/8986246

相关文章

  • Python 潮流周刊第 31 期(摘要)
    本周刊由Python猫出品,精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进Python技术,并增长职业和副业的收入。以下是本期摘要:......
  • Python中全局解释器GIL的相关问题
    1、全局解释器锁(GIL)的影响Python中可以实现多线程,但是受到全局解释器锁(GIL)的限制,因此在某些情况下,多线程并不能实现真正的并行执行。这是因为在CPython中,由于GIL的存在,同一时刻只能有一个线程执行Python字节码(解释器层面的限制)。本质上来说,GIL只会影响解释器层面运行python......
  • python .gitignore 文件模板 & 相关注意事项
    参考:https://blog.csdn.net/qq_38122800/article/details/132663030https://blog.csdn.net/weixin_42289273/article/details/122912938https://zhuanlan.zhihu.com/p/22494724在使用git进行代码版本管理时,对于不想提交的部分内容,可以通过.gitignore文件来配置提交时......
  • python中for循环跟while循环的对比(加深记忆)
    while循环和for循环的对比 通过对比更能理解循环在循环控制上:    whlie循环可以自定循环条件,并自行控制    for循环不可以自定循环条件,只可以一个个从容器内取出数据在无限循环上:     while循环可以通过条件控制做到无限循环      fo......
  • 【Python数据分析课程设计】——员工离职原因大数据分析
    一、选题的背景    随着社会经济的发展和科学技术的进步,员工离职现象越来越普遍。员工离职不仅会影响企业的运营和发展,也会对员工的职业生涯产生影响。因此,探究员工离职的原因是十分必要的。本选题旨在通过数据分析,深入挖掘员工离职的原因,为企业管理者提供决策支持,同时帮......
  • EF Core助力信创国产数据库
    前言国产数据库作为国产化替代的重要环节,在我国信创产业政策的指引下实现加速发展,我们国产数据库已进入百花齐放的快速发展期,相信接触到政府类等项目的童鞋尤为了解,与此同时我们有一部分也在使用各种开源的ORM都早已支持主流国产数据库,我们也有一部分在使用官方EFCore但没有对国产......
  • Python代码中的偏函数
    本文介绍了在Python中使用偏函数partial的方法,并且介绍了两个使用partial函数的案例,分别是concurrent并行场景和基于jax的自动微分场景。在这些相关的场景下,我们用partial函数更多时候可以使得代码的可读性更好,在性能上其实并没有什么提升。如果不想使用partial函数,类似的......
  • Python追踪内存占用
    本文介绍了一个工具tracemalloc,可以在Python代码的执行过程中对每一步的内存占用进行记录。技术背景当我们需要对python代码所占用的内存进行管理时,首先就需要有一个工具可以对当前的内存占用情况进行一个追踪。虽然在Top界面或者一些异步的工具中也能够看到实时的内......
  • Python定位错误:段错误 (核心已转储)
    解决Python编程中可能出现的“段错误(核心已转储)”,并没有其他任何提示信息的问题。技术背景在各种编程语言中都有可能会遇到这样一个报错:“段错误(核心已转储)”。显然是编写代码的过程中有哪里出现了问题,但是这个报错除了这几个字以外没有任何的信息,我们甚至不知道......
  • 基于Python-Windows环境的Excel页面截图并邮件正文发送
    截图模块#截图模块defget_snapshot():#定义变量#excel文件的绝对位置excel_file=r'E:\L.xlsx'#输出图片的绝对位置output_png_path=r'E:\L.png'#excel的sheet名称excel_tb='每日销售'#注意要装excel软件,否则会报错excel=win......