使用python的pandas包查询数据库数据导出到excel

2023-11-11

前言

前几天接到一个业务的需求,让我把当前数据库里面的结果数据导出到excel中,然后供业务查看。问题是当前结果数据都是列式表,所以需要把数据做一个行列转换,但是业务还有一个需求,要求不同分类的数据展示不同的列并且需要导出到不同的sheet中。没办法,只能去思考怎么实现。
#博学谷IT学习技术支持#

数据大概长这样:

id category key value
id1 分类1 属性1
id2 分类1 属性5
id3 分类2 属性2
id4 分类2 属性3
id5 分类3 属性1
id6 分类4 属性4

1.实现分析

方案一 建立一张大宽表
首先第一想到的是建立一张大宽表,把所有的属性都建上去,然后一把行列转换,把值都转换上去。最后把这个表的数据导出到excel上面。跟业务说了这个方法,他们表示不爽,这么宽的excel(大概600列)我怎么看呢,况且不给我分类,而且列里面肯定有很多的空值,因为不同的分类的属性都不一样。所以这个方法pass。

方案二 建立多张表
没办法,第二想到的是按照不同分类建不同的表,不同表里的字段不一样,跟分类的属性一致。然后写一个存储过程,循环不同的分类查出数据行列转换插入数据到不同的表中,然后把表的数据导出到excel中。但是我一数大概几百个分类,也就是说我要建几百张表,然后导出excel,算了还是作为备选方案。

方案三 使用脚本实现
这种情况我感觉只能写脚本,由于本人python只会helloworld,于是就去查资料,终于找到两个包:pandas、psycopg2。
了解到pandas是python数据分析的应用最广泛的包,然后psycopg2可以用来连接pg数据库。有了这两个包,然后业务逻辑写一下不就是我要的功能么。

2.实现过程

2.1安装环境

1.下载Anaconda,直接搜索官网:https://www.anaconda.com/,下载安装包,然后直接点击下一步,所有勾选项全部勾上,直到结束。这样之后,anaconda就会帮我们装好了python环境,conda包管理工具,最重要的是它帮我们装好了一大堆数据分析工具包,包括pandas。
2.然后打开电脑命令行cmd,输入pip install psycopg2,装好pg连接驱动包
备注:如果想新建一个环境,可以使用:conda create -n python36 python=3.6命令新建一个python环境,然后activate python36命令切换到这个环境下,安装包。

2.3功能逻辑

1.psycopg2连接pg数据库

class ADBPGClient(object):
    def __init__(self, url, db, usr, pwd):
        self._client = psycopg2.connect(
            database=db
            , user=usr
            , password=pwd
            , host=url
            , port="5432"
        )
        self._cursor = self._client.cursor()

    def query(self, sql):
        self._cursor.execute(sql)
        re_query = self._cursor.fetchall()
        self._cursor.close()
        return re_query

    def close(self):
        self._client.close()

2.pandas行列转换

        conn = psycopg2.connect(conn_string)
        df = pd.read_sql(pg_sql, conn)
        dt = pd.pivot(df,index="id",columns="key",values="value")

3.pandas生成excel

dt.to_excel(writer, sheet_name=unicode(sheetname, "utf-8"))

2.4完整代码

有了上面的功能代码,只需要一个循环即可实现需求,循环分类,然后查询出table_result的不同分类的结果,不同的查询结果做一个行列转换然后写入到excel的不同sheet页中即可。

# coding=utf-8
import pandas as pd
import psycopg2


class ADBPGClient(object):
    def __init__(self, url, db, usr, pwd):
        self._client = psycopg2.connect(
            database=db
            , user=usr
            , password=pwd
            , host=url
            , port="5432"
        )
        self._cursor = self._client.cursor()

    def query(self, sql):
        self._cursor.execute(sql)
        re_query = self._cursor.fetchall()
        self._cursor.close()
        return re_query

    def close(self):
        self._client.close()


if __name__ == "__main__":
    """链接ADBPG使用的参数"""
    pg_url = "主机名称"
    pg_usr = "用户"
    pg_pwd = "密码"
    pg_db = "数据库"
    postgres_port = "5432"
    pg_cli = ADBPGClient(pg_url, pg_db, pg_usr, pg_pwd)
    pg_sql = "select distinct category from  table_result;"
    pg_re = pg_cli.query(pg_sql)
    pg_cli.close()
    i = 0
    writer = pd.ExcelWriter(u"汇总数据.xlsx")
    for category in pg_re:
        categoryStr = category[0] + ""
        pg_cli = ADBPGClient(pg_url, pg_db, pg_usr, pg_pwd)
        pg_sql = "select id,category ,key,value from  table_result where category ='{0}' order by id;".format(
            categoryStr)
        conn_string = "host=" + pg_url + " port=" + postgres_port + " dbname=" + pg_db + " user=" + pg_usr + " password=" + pg_pwd
        conn = psycopg2.connect(conn_string)
        df = pd.read_sql(pg_sql, conn)
        dt = pd.pivot(df,index="id",columns="key",values="value")
        sheetname = str.replace(categoryStr,"/","-")
        dt.to_excel(writer, sheet_name=unicode(sheetname, "utf-8"))
        i = i + 1
        print i
    writer.save()

3.总结

有时候使用sql去做一些循环、迭代等逻辑或者动态列查询的需求不太好实现,这时候使用python的数据分析包去做就会简单很多,所以数据开发还是得学习下python。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用python的pandas包查询数据库数据导出到excel 的相关文章

随机推荐

  • Windows Cluster 分布式算法

    在分布式系统中 都需要解决分布式一致性问题 那么 在Windows 集群中 使用了什么算法来保证集群的一致性呢 Paxos Windows Server 故障转移集群 WSFC 使用 Paxos 算法在整个系统中同步更改 通过记录 Paxo
  • 计算机四级网络考试容易蒙吗,计算机四级网络工程师通过率有多少

    计算机四级网络工程师通过率怎么样 我们都知道计算机四级网络工程师非常的难考 所以想大概知道下通过率是怎样的 给自己保个底 所以下面就由小编来给大家说说计算机四级网络工程师通过率是怎么样的吧 欢迎大家前来阅读 计算机四级网络工程师通过率 计算
  • C++宏定义

    define是C语言中提供的宏定义命令 其主要目的是为程序员在编程时提供一定的方便 并能在一定程度上提高程序的运行效率 用处 define命令是C语言中的一个宏定义命令 它用来将一个标识符定义为一个字符串 该标识符被称为宏名 被定义的字符串
  • Servlet[搭建web开发环境,将项目部署到服务器、创建web程序]

    目录 web开发环境搭建 创建web后端项目并部署到服务器的步骤 创建web后端程序 如何搭建后端服务器 如何开发后端服务器程序 实现前后端交互 开发第一个web应用程序 什么是服务器 广义上的服务器 计算机硬件 计算机软件 狭义上的服务器
  • docker镜像的导出与导入

    内网干活的忧桑大概就是偷点懒 使用docker镜像 dockerfile中使用的镜像内网中却没法down下来 so 找个外网机 先把需要的镜像下载下来 再将下载好的镜像载入到内网机 通过查资料 docker镜像的导入导出命令有save lo
  • 前端组件Bootstrap4(学习笔记一)

    Hello 大家好 今天要分享的文章仍然是关于前端的 为什么迟迟没有关于Android相关的文章呢 其实这个公众号一开始 我就有明确的表示 它不仅仅局限于Android 我希望它可以博采众长 以Android为主 其它技术为辅 夹杂一些社会
  • Unity3D之UI按键绑定事件案例(七)

    七 多个按键事件存在的时候怎么区分 怎么同时绑定事件 下面的案例可以给出答案 第一步 通过Hierarchy面板创建多个button 第二步 创建一个名为Buttons的脚本 代码如下 public class MyEventArgs pu
  • web前端可视化开发,前端优秀实践指南,知乎上已获万赞

    前言 跳槽 这在 IT 互联网圈是非常普遍的 也是让自己升职加薪 走上人生巅峰的重要方式 那么作为一个普通的Android程序猿 我们如何才能斩获大厂offer 呢 疫情向好 面试在即 还在迷茫踌躇中的后浪们 如何才能在面试中让自己脱颖而出
  • Qt自定义控件 —— 颜色选择组合控件

    在开始阅读本文之前 如果您有学习创建Qt自定义控件并在其他项目中引用的需求 请参考 Linux系统下在Qt Creator中创建自定义控件并在其他项目中引用https blog csdn net YMGogre article detail
  • head 请求了解过吗?如何用 get 模拟 head 请求?不需要服务器返回数据,怎么实现?

    HEAD请求是HTTP 1 1协议中定义的一个请求方法 与GET请求相似 但只请求目标URL的头部 不请求实际的数据或者说正文内容 其主要用途是 检查资源是否被修改 检查资源是否存在 校验缓存有效性 了解服务器性能 要用GET请求模拟HEA
  • [已解决]“ImportError: No module named flask”

    1 删除原有的用大写开头的Flask插件 pip uninstall Flask 2 yum安装 flask yum install python flask 3 等待安装完成就可以允许程序啦 100 有用
  • 快速编写json数据

    1 打开idea 2 新建txt文件 alt 单击快速加 编写json数据
  • C语言面试必问的经典问题(纯”gan“货)

    C语言面试必问的经典问题 1 预处理 1 预编译 编译过程最先做的工作是啥 何时需要预编译 指令有什么 答 预编译就是预处理 就是把一些文本的替换工作工作 预编译指令 include ifdef ifndef else endif 编译 字
  • 高德地图Js API的使用

    申请JSAPI的开发者key 申请地址 http lbs amap com dev key 引入高德地图JavaScript API文件 创建地图容器 在页面body里你想展示地图的地方创建一个div 容器 并指定id标识 div div
  • Python-Pyqt6之QIntValidator,QDoubleValidator无法限制数值范围的正则表达式解决方案

    在使用Pyqt6进行GUI设计的时候 在需要输入数值 整型 浮点型 的时候选择使用了QLineEdit这个组件控件 详情介绍 QLineEdit组件详情 QLineEdit自带的setValidator包含 QIntValidator QD
  • promise函数几种写法与坑

    promise是ES6中引入的处理异步函数的强大特性 但是对promise的不恰当使用可能会达不到最终目的 对这个问题的探究来源于这篇文章关于promises 你理解了多少 几个异步函数如下 resolve或reject在回调函数里被调用
  • 网络编程的几种I/O模式

    1 非阻塞I O 非阻塞I O 若想网络编程时调用I O函数不想让程序阻塞 需要使用I O复用技术 一个方法是poll 轮询 所谓轮询就是执行函数时 如果内核不能立即对应用的函数进行响应时 就返回给应用一个错误 而应用不停的循环调用该函数
  • JavaScript表示不背小数计算存在误差的锅

    浮点数的最高精度是17位小数 但是在实际计算时会产生莫名其妙的问题 如0 1 0 2的结果不是0 3 而是0 30000000000000004 这个舍入误差会导致无法测试特定的浮点数值 例如 var a 0 1 b 0 2 if a b
  • 【数据结构】采用邻接矩阵表示法创建无向网、无向图、有向图、有向网

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 目录 一 无向网 权值 对称 1 思路 2 代码 3 运行结果 三 其他 1 无向图 0 1 对称 2 有向网 权值 不对称 3 有向图 0 1 不对称 一 无向网 1 思路
  • 使用python的pandas包查询数据库数据导出到excel

    文章目录 前言 1 实现分析 2 实现过程 2 1安装环境 2 3功能逻辑 2 4完整代码 3 总结 前言 前几天接到一个业务的需求 让我把当前数据库里面的结果数据导出到excel中 然后供业务查看 问题是当前结果数据都是列式表 所以需要把