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

x33g5p2x  于2022-05-19 转载在 Python  
字(3.5k)|赞(0)|评价(0)|浏览(519)

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客户端库
  1. import pandas as pd
  2. import warnings
  3. import pymysql

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

  1. # 数据库配置
  2. MYSQL_HOST_ITEM = '127.0.0.1'
  3. MYSQL_PORT_ITEM = 3306
  4. MYSQL_USER_ITEM = 'root'
  5. MYSQL_PASSWORD_ITEM = '11'
  6. MYSQL_DATABASE_ITEM = 'test'
  7. MYSQL_CHARSET_ITEM = 'utf8'
  8. # 定义连接mysql函数
  9. def connetmysql(host, port, user, password, database, sql, charset='utf8'):
  10. conn = pymysql.connect(host=host,
  11. port=port,
  12. user=user,
  13. password=password,
  14. database=database,
  15. charset=charset)
  16. cursor = conn.cursor()
  17. sql = """%s""" % sql
  18. # 遇到时间格式自动解析
  19. df_mysql = pd.read_sql(sql, conn, parse_dates=True)
  20. df_mysql.columns = [x.lower() for x in df_mysql.columns]
  21. cursor.close()
  22. return df_mysql

先查询出ids

  1. def readPlatformDept():
  2. sql_script = '''
  3. SELECT id from t1
  4. '''
  5. sql_data = connetmysql(host=MYSQL_HOST_PLATFORM, port=MYSQL_PORT_PLATFORM,
  6. user=MYSQL_USER_PLATFORM,
  7. password=MYSQL_PASSWORD_PLATFORM, sql=sql_script,
  8. database=MYSQL_DATABASE_PLATFORM)
  9. return sql_data

通过ids 使用in查询

  1. def readItemDeptNum(codes):
  2. sql_script = '''SELECT
  3. *
  4. FROM
  5. t2
  6. code in ({codes})
  7. '''.format(codes=', '.join("'" + item + "'" for item in codes))
  8. # sql_script = sql_script % ','.join(['%s']*len(tongyicodes))
  9. sql_data = connetmysql(host=MYSQL_HOST_ITEM, port=MYSQL_PORT_ITEM,
  10. user=MYSQL_USER_ITEM,
  11. password=MYSQL_PASSWORD_ITEM, sql=sql_script,
  12. database=MYSQL_DATABASE_ITEM)
  13. return sql_data

main函数进行调用

  1. if __name__ == "__main__":
  2. platform_data = readPlatformDept()
  3. item_data = readItemDepNum(platform_data['id'])
  4. # 导出Excel
  5. item_data.to_excel('item_query_excel.xlsx')
  1. import pandas as pd
  2. import warnings
  3. import pymysql
  4. warnings.filterwarnings("ignore")
  5. # Platform配置
  6. MYSQL_HOST_PLATFORM = '127.0.0.1'
  7. MYSQL_PORT_PLATFORM = 3306
  8. MYSQL_USER_PLATFORM = 'root'
  9. MYSQL_PASSWORD_PLATFORM = '111'
  10. MYSQL_DATABASE_PLATFORM = 'test'
  11. MYSQL_CHARSET_PLATFORM = 'utf8'
  12. # ITEM配置
  13. MYSQL_HOST_ITEM = '127.0.0.1'
  14. MYSQL_PORT_ITEM = 33306
  15. MYSQL_USER_ITEM = 'root'
  16. MYSQL_PASSWORD_ITEM = '111'
  17. MYSQL_DATABASE_ITEM = 'item'
  18. MYSQL_CHARSET_ITEM = 'utf8'
  19. # 定义连接mysql函数
  20. def connetmysql(host, port, user, password, database, sql, charset='utf8'):
  21. conn = pymysql.connect(host=host,
  22. port=port,
  23. user=user,
  24. password=password,
  25. database=database,
  26. charset=charset)
  27. cursor = conn.cursor()
  28. sql = """%s""" % sql
  29. # 遇到时间格式自动解析
  30. df_mysql = pd.read_sql(sql, conn, parse_dates=True)
  31. df_mysql.columns = [x.lower() for x in df_mysql.columns]
  32. cursor.close()
  33. return df_mysql
  34. def readPlatformDept():
  35. sql_script = '''
  36. SELECT id from t1
  37. '''
  38. sql_data = connetmysql(host=MYSQL_HOST_PLATFORM, port=MYSQL_PORT_PLATFORM,
  39. user=MYSQL_USER_PLATFORM,
  40. password=MYSQL_PASSWORD_PLATFORM, sql=sql_script,
  41. database=MYSQL_DATABASE_PLATFORM)
  42. return sql_data
  43. def readItemDeptNum(codes):
  44. sql_script = '''SELECT
  45. *
  46. FROM
  47. t2
  48. code in ({codes})
  49. '''.format(codes=', '.join("'" + item + "'" for item in codes))
  50. # sql_script = sql_script % ','.join(['%s']*len(tongyicodes))
  51. sql_data = connetmysql(host=MYSQL_HOST_ITEM, port=MYSQL_PORT_ITEM,
  52. user=MYSQL_USER_ITEM,
  53. password=MYSQL_PASSWORD_ITEM, sql=sql_script,
  54. database=MYSQL_DATABASE_ITEM)
  55. return sql_data
  56. if __name__ == "__main__":
  57. platform_data = readPlatformDept()
  58. item_data = readItemDepNum(platform_data['id'])
  59. item_data.to_excel('item_query_excel.xlsx')

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

  1. python3 start.py

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

相关文章