首页 > 编程语言 >Finereport调用python服务进行大数据量导出

Finereport调用python服务进行大数据量导出

时间:2024-12-19 16:44:12浏览次数:8  
标签:__ 数据量 python Finereport params file sql output csv

Finereport调用python服务进行大数据量导出

Aerial view of woman using a computer laptop on a marble table

背景:

在使用finereport过程中,我们发现在数据导出这块一直是一个瓶颈,闲来无事,思索一番,想出来一种场景来应对此问题。供各位大佬参考讨论,也欢迎其他大佬提供更好的解决方案。

文笔较差,大佬见谅。

废话不多说,直接上代码,案例。

正文:

首先,我们需要使用python启一个flask服务,来供传递参数,sql等。

本次举例写的固定sql,后续大家可以自行优化扩展。

1.启动flask服务

from flask import Flask, request, jsonify, send_file
import pymysql
import pandas as pd
import threading
import os
import time

app = Flask(__name__)

# 数据库连接配置
db_config = {
   'host': 'ip',
   'user': '用户名',
   'password': '密码',
   'database': '数据库'
}

# 数据库连接
def connect_db():
   return pymysql.connect(**db_config)

# 导出到CSV函数
def export_to_csv(sql, params, output_file):
   connection = connect_db()
   try:
       # 执行查询并使用参数化查询
       with connection.cursor() as cursor:
           cursor.execute(sql, params)  # 使用参数化查询
           result = cursor.fetchall()

           # 如果没有结果,返回None
           if not result:
               return None

           # 将查询结果转换为DataFrame并写入CSV
           df = pd.DataFrame(result, columns=[i[0] for i in cursor.description])
           df.to_csv(output_file, index=False, encoding='utf-8')

           print(f"CSV文件已生成: {output_file}")
           return output_file
   finally:
       connection.close()

# 后台线程处理文件导出
def generate_csv(sql, params, output_file):
   export_to_csv(sql, params, output_file)

# 这里为了验证场景使用的get请求,实际大多数情况下都需要传递参数,推荐post请求。
@app.route('/run_report', methods=['GET'])
def run_report():
   params = request.args.getlist('params')  # 获取URL查询参数
   sql = "SELECT * FROM test_table"  # 默认的SQL查询

   # 生成唯一的输出文件名(可以用时间戳或UUID)
   output_file = f'output_{int(time.time())}.csv'

   # 启动后台线程生成CSV文件
   thread = threading.Thread(target=generate_csv, args=(sql, params, output_file))
   thread.start()

   # 等待线程完成,确保文件生成后直接返回文件
   thread.join()  # 确保线程完成后返回

   # 如果文件生成成功,直接返回文件
   if os.path.exists(output_file):
       return send_file(output_file, as_attachment=True, mimetype='text/csv')
   else:
       return jsonify({'error': '生成CSV文件失败'}), 500

if __name__ == '__main__':
   app.run(debug=True)

2.创建模板:

在按钮点击事件上绑定服务地址即可。

提示这块目前做的比较粗糙,大家可以自行优化。

window.location.href="http://127.0.0.1:5000/run_report"
FR.Msg.alert("提示","数据正在下载请稍后");

3.示例模板

下载后台导出.rar (1.99 K)

4.示例操作

img

不知道怎么上传视频,大家自己尝试吧

第一次写贴子,写的不咋好,大家见谅,感谢。顺便吐槽一句,这个发帖写作的好难使用啊。

目前仅为思路的验证,代码健壮性目前比较差,见谅。

标签:__,数据量,python,Finereport,params,file,sql,output,csv
From: https://www.cnblogs.com/shuiyirar/p/18617537

相关文章

  • python的eval()函数的作用是将字符串转换成数值吗?
    不完全正确。Python的eval()函数的作用是将一个字符串作为Python表达式求值,并返回表达式的值。这意味着eval()可以处理各种数据类型和表达式,而不仅仅是将字符串转换成数值。例如:#将字符串转换为数值num_str="3+5"result=eval(num_str)print(result)#输出:8......
  • python报错:No pyvenv.cfg file
    目录一、遇到问题二、出现问题的原因三、解决步骤一、遇到问题新建python项目运行的时候发现了报错这个,之前运行或者给别人运行就没问题,排除了是代码报错,那就只有可能是环境问题了。这个翻译就是缺失这个文件,项目如下 Nopyvenv.cfgfile项目还有这个.venv文件.v......
  • 数据结构与算法Python版 冒泡排序与选择排序
    文章目录一、冒泡排序二、选择排序一、冒泡排序冒泡排序BubbleSort对无序表进行多趟比较交换,每趟包括了多次两两相邻比较,并将逆序的数据项互换位置,最终能将本趟的最大项就位经过n-1趟比较交换,实现整表排序。每趟的过程类似于“气泡”在水中不断上浮到水面第1......
  • Python 相等判断
    注:本篇完成时使用的Python版本为3.13.0Python中,判断两变量是否相同,通常有is(isnot)和==(!=)两种方法。1、is/isnot身份运算符用于比较两个对象的存储单元,即判断两个对象标识符是否引用自同一对象。示例1: a=[1,2,3]b=ac=[1,2,3]d=a.copy()e=a[:]prin......
  • python基础知识(五)
    文章目录错误和异常异常处理try...excepttry/except...elsetry-finally语句抛出异常自定义异常面向对象类定义构造方法及self的使用initself继承类的属性和方法类的私有属性类的方法类的私有方法运算符重载命名空间与作用域命名空间作用域全局变量和局部变量globa......
  • 【Python】调用 image.verify() 后报错 AttributeError_ ‘PngImageFile‘ object has
    【Python】调用image.verify()后报错AttributeError:‘PngImageFile’objecthasnoattribute‘load_seek’问题描述file=request.files.get('file')iffile:file_content=file.read()file_stream=BytesIO(file_content)......
  • 使用dockerfile构建python3的镜像并启动容器另一种方式
    使用dockerfile构建python3的镜像并启动容器另一种方式1.新建目录DockerfilesmkdirDockerfilescdDockerfiles2.新建文件DockerfiletouchDockerfile写入以下内容:FROMcentos:7.6.1810MAINTAINERtest#指定作者信息RUNset-ex\#预安装所需组件&......
  • Linux 定时任务操作详解及python简单的任务管理器
    Linux定时任务操作在Linux中,定时任务操作主要通过cron工具来实现。cron是一个基于时间的作业调度器,允许用户在指定的时间或周期内执行预定的任务。1.查看当前用户的定时任务使用crontab命令查看当前用户的定时任务:crontab-l2.编辑定时任务使用crontab-e......
  • 教你成为学霸第一期——深入了解C / C++ / Python / Java 语言的优势与劣势
     给我一点时间,我可以将你从小白变成资深学霸目录C语言一、优势(一)高效性与速度(二)简洁性与灵活性(三)可移植性(四)丰富的库支持二、劣势(一)复杂的语法和指针操作(二)缺乏现代编程特性(三)内存管理手动性(四)开发效率相对较低C++语言一、优势(一)面向对象编程特性(二)高效性......
  • 教你成为学霸第二期——了解C / C++ / Python / Java头文件
      给我一点时间,我可以将你从小白变成资深学霸目录一、C++头文件(一)(二)(三)二、C头文件(一)(二)三、Python模块(类似头文件概念的部分体现)(一)math模块(二)os模块(三)random模块四、Java包(相关但和传统头文件有区别)和导入语句一、C++头文件在C++编程的世界里,头......