Finereport调用python服务进行大数据量导出
背景:
在使用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)
def export_to_csv(sql, params, output_file): connection = connect_db() try: with connection.cursor() as cursor: cursor.execute(sql, params) result = cursor.fetchall() if not result: return None 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)
@app.route('/run_report', methods=['GET']) def run_report(): params = request.args.getlist('params') sql = "SELECT * FROM test_table" output_file = f'output_{int(time.time())}.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.示例操作
不知道怎么上传视频,大家自己尝试吧
第一次写技术文章,写的不咋好,大家见谅,感谢。顺便吐槽一句,这个发帖写作的好难使用啊。
目前仅为思路的验证,代码健壮性目前比较差,见谅。 |