Python系列之MySQL查询数据导出Excel

举报
yd_273762914 发表于 2022/05/19 22:56:54 2022/05/19
【摘要】 Python系列之MySQL查询数据导出Excel 最近接到需求,需要通过一条SQL查询出来的id,去过滤另外一条SQL的数据,听起来并不难,但是因为业务原因需要查询很多个环境,而且需要经常查询,...

Python系列之MySQL查询数据导出Excel

最近接到需求,需要通过一条SQL查询出来的id,去过滤另外一条SQL的数据,听起来并不难,但是因为业务原因需要查询很多个环境,而且需要经常查询,所以想到通过python程序来实现,先查出一个SQL数据,然后通过id拼装in查询出数据。

开发环境

  • MySQL 10.1.38-MariaDB-1~bionic
  • Python3.7.8

开发工具

  • PyCharm2018.1
  • SmartGit18.1
  • Navicat15.0.28

先引入一些依赖,主要有pandaspymysql

  • Pandas 是基于 BSD 许可的开源支持库,为 Python 提供了高性能、易使用的数据结构与数据分析工具。
  • Pymysql:PyMySQL是从Python连接到MySQL数据库服务器的接口。 它实现了Python数据库API v2.0,并包含一个纯Python的MySQL客户端库
import pandas as pd
import warnings

import pymysql


  
 
  • 1
  • 2
  • 3
  • 4
  • 5

先进行数据库配置,需要引入pymysql,封装一个连接数据库的函数



# 数据库配置
MYSQL_HOST_ITEM = '127.0.0.1'
MYSQL_PORT_ITEM = 3306
MYSQL_USER_ITEM = 'root'
MYSQL_PASSWORD_ITEM = '11'
MYSQL_DATABASE_ITEM = 'test'
MYSQL_CHARSET_ITEM = 'utf8'

# 定义连接mysql函数
def connetmysql(host, port, user, password, database, sql, charset='utf8'):
    conn = pymysql.connect(host=host,
                           port=port,
                           user=user,
                           password=password,
                           database=database,
                           charset=charset)
    cursor = conn.cursor()
    sql = """%s""" % sql
    # 遇到时间格式自动解析
    df_mysql = pd.read_sql(sql, conn, parse_dates=True)
    df_mysql.columns = [x.lower() for x in df_mysql.columns]
    cursor.close()
    return df_mysql



  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

先查询出ids


def readPlatformDept():
    sql_script = '''
      SELECT id from t1
    '''
    sql_data = connetmysql(host=MYSQL_HOST_PLATFORM, port=MYSQL_PORT_PLATFORM,
                                            user=MYSQL_USER_PLATFORM,
                                            password=MYSQL_PASSWORD_PLATFORM, sql=sql_script,
                                            database=MYSQL_DATABASE_PLATFORM)
    return sql_data



  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

通过ids 使用in查询

def readItemDeptNum(codes):
    sql_script = '''SELECT
      *
    FROM
        t2
        code in ({codes})
        '''.format(codes=', '.join("'" + item + "'" for item in codes))
    # sql_script = sql_script % ','.join(['%s']*len(tongyicodes))
    sql_data = connetmysql(host=MYSQL_HOST_ITEM, port=MYSQL_PORT_ITEM,
                           user=MYSQL_USER_ITEM,
                           password=MYSQL_PASSWORD_ITEM, sql=sql_script,
                           database=MYSQL_DATABASE_ITEM)

    return sql_data


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

main函数进行调用

if __name__ == "__main__":
    platform_data = readPlatformDept()
    item_data = readItemDepNum(platform_data['id'])
    # 导出Excel
    item_data.to_excel('item_query_excel.xlsx')

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
import pandas as pd
import warnings

import pymysql

warnings.filterwarnings("ignore")

# Platform配置
MYSQL_HOST_PLATFORM = '127.0.0.1'
MYSQL_PORT_PLATFORM = 3306
MYSQL_USER_PLATFORM = 'root'
MYSQL_PASSWORD_PLATFORM = '111'
MYSQL_DATABASE_PLATFORM = 'test'
MYSQL_CHARSET_PLATFORM = 'utf8'
# ITEM配置
MYSQL_HOST_ITEM = '127.0.0.1'
MYSQL_PORT_ITEM = 33306
MYSQL_USER_ITEM = 'root'
MYSQL_PASSWORD_ITEM = '111'
MYSQL_DATABASE_ITEM = 'item'
MYSQL_CHARSET_ITEM = 'utf8'

# 定义连接mysql函数
def connetmysql(host, port, user, password, database, sql, charset='utf8'):
    conn = pymysql.connect(host=host,
                           port=port,
                           user=user,
                           password=password,
                           database=database,
                           charset=charset)
    cursor = conn.cursor()
    sql = """%s""" % sql
    # 遇到时间格式自动解析
    df_mysql = pd.read_sql(sql, conn, parse_dates=True)
    df_mysql.columns = [x.lower() for x in df_mysql.columns]
    cursor.close()
    return df_mysql


def readPlatformDept():
    sql_script = '''
      SELECT id from t1
    '''
    sql_data = connetmysql(host=MYSQL_HOST_PLATFORM, port=MYSQL_PORT_PLATFORM,
                                            user=MYSQL_USER_PLATFORM,
                                            password=MYSQL_PASSWORD_PLATFORM, sql=sql_script,
                                            database=MYSQL_DATABASE_PLATFORM)
    return sql_data

def readItemDeptNum(codes):
    sql_script = '''SELECT
      *
    FROM
        t2
        code in ({codes})
        '''.format(codes=', '.join("'" + item + "'" for item in codes))
    # sql_script = sql_script % ','.join(['%s']*len(tongyicodes))
    sql_data = connetmysql(host=MYSQL_HOST_ITEM, port=MYSQL_PORT_ITEM,
                           user=MYSQL_USER_ITEM,
                           password=MYSQL_PASSWORD_ITEM, sql=sql_script,
                           database=MYSQL_DATABASE_ITEM)

    return sql_data

if __name__ == "__main__":
    platform_data = readPlatformDept()
    item_data = readItemDepNum(platform_data['id'])
    item_data.to_excel('item_query_excel.xlsx')

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68

然后程序就写好了,需要写一个shell脚本启动一些python

python3 start.py

  
 
  • 1

因为是java开发,python并没有学过,所以通过自己摸索,还是可以写出来,对比一下java,觉得python语法有时候确实比较简便,比如要导出Excel,一行代码就可以,然后到linux上部署也比较容易,所以觉得后端程序员掌握一门脚本语言还是有需要的

文章来源: smilenicky.blog.csdn.net,作者:smileNicky,版权归原作者所有,如需转载,请联系作者。

原文链接:smilenicky.blog.csdn.net/article/details/124823705

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。