Python Pandas带多组参数和标签的Oracle数据库批量数据导出程序

ops/2025/2/27 9:44:24/

设计一个基于多个带标签的PL/SQL模板作为配置文件和多组参数的Python Pandas代码程序,实现根据不同的输入参数自动批量地将Oracle数据库中的数据导出为CSV和Excel文件到指定目录上,标签和多个参数(以“_”分割)为组成导出数据文件名,文件已经存在则覆盖原始文件。

该解决方案提供了灵活的配置方式和可靠的错误处理机制,能够满足批量数据导出的需求,同时保证生成文件的规范性和一致性。使用Pandas和cx_Oracle实现多模板多参数的Oracle数据导出程序:

python">import os
import cx_Oracle
import pandas as pd
import yaml
import json
from pathlib import Pathclass OracleDataExporter:def __init__(self, config_path, params_path, output_dir, db_conn_str):"""初始化导出器:param config_path: SQL模板配置文件路径:param params_path: 参数配置文件路径:param output_dir: 输出目录:param db_conn_str: 数据库连接字符串"""self.config_path = config_pathself.params_path = params_pathself.output_dir = Path(output_dir)self.db_conn_str = db_conn_strself.connection = None# 创建输出目录self.output_dir.mkdir(parents=True, exist_ok=True)def _load_config(self):"""加载SQL模板配置"""with open(self.config_path) as f:return yaml.safe_load(f)['templates']def _load_params(self):"""加载参数配置"""with open(self.params_path) as f:return json.load(f)def _generate_filename(self, label, params, param_order):"""生成标准文件名:param label: 模板标签:param params: 参数字典:param param_order: 参数顺序列表"""param_values = [str(params[key]) for key in param_order]return f"{label}_{'_'.join(param_values)}"def _export_files(self, df, base_filename):"""导出数据文件"""csv_path = self.output_dir / f"{base_filename}.csv"excel_path = self.output_dir / f"{base_filename}.xlsx"# 导出CSV(覆盖模式)df.to_csv(csv_path, index=False, mode='w')# 导出Excel(覆盖模式)df.to_excel(excel_path, index=False, engine='openpyxl')return csv_path, excel_pathdef _validate_parameters(self, params, required_params):"""验证参数完整性"""missing = [p for p in required_params if p not in params]if missing:raise ValueError(f"Missing required parameters: {missing}")def execute(self):"""执行导出流程"""# 加载配置templates = self._load_config()all_params = self._load_params()try:# 建立数据库连接self.connection = cx_Oracle.connect(self.db_conn_str)# 遍历所有模板for template in templates:label = template['label']sql_template = template['sql']param_order = template['params_order']param_groups = all_params.get(label, [])if not param_groups:print(f"⚠️ No parameters found for template '{label}', skipping...")continueprint(f"🔨 Processing template: {label}")# 处理每个参数组for params in param_groups:try:self._validate_parameters(params, param_order)base_name = self._generate_filename(label, params, param_order)print(f"🔧 Executing with parameters: {params}")df = pd.read_sql(sql_template, self.connection, params=params)csv_path, excel_path = self._export_files(df, base_name)print(f"✅ Exported: {csv_path.name} and {excel_path.name}")except Exception as e:print(f"❌ Error processing parameters {params}: {str(e)}")continuefinally:if self.connection:self.connection.close()if __name__ == "__main__":# 配置参数CONFIG = {"config_path": "config/sql_templates.yaml","params_path": "config/parameters.json","output_dir": "exports","db_conn_str": "username/password@hostname:port/service_name"}# 执行导出exporter = OracleDataExporter(**CONFIG)exporter.execute()

配套配置文件示例

1. SQL模板配置文件 (sql_templates.yaml)

templates:- label: sales_reportsql: |SELECT *FROM sales_dataWHERE region = :regionAND year = :yearAND product_category = :categoryparams_order: [region, year, category]- label: customer_listsql: |SELECT customer_id, name, statusFROM customersWHERE registration_date >= :start_dateAND registration_date <= :end_dateparams_order: [start_date, end_date]

2. 参数配置文件 (parameters.json)

{"sales_report": [{"region": "North", "year": 2023, "category": "Electronics"},{"region": "South", "year": 2022, "category": "Furniture"}],"customer_list": [{"start_date": "2023-01-01", "end_date": "2023-03-31"},{"start_date": "2023-04-01", "end_date": "2023-06-30"}]
}

关键功能说明

  1. 模板管理

    • 使用YAML格式定义SQL模板
    • 每个模板包含唯一标签、SQL语句和参数顺序定义
    • 支持多行SQL语句和命名参数
  2. 参数管理

    • JSON格式存储参数组
    • 参数组按模板标签分组管理
    • 自动验证参数完整性
  3. 文件生成

    • 自动生成标准化文件名(标签_参数1_参数2…)
    • 同时生成CSV和Excel文件
    • 自动覆盖已存在文件
  4. 错误处理

    • 参数完整性验证
    • 数据库连接安全管理
    • 异常捕获和友好提示
  5. 扩展性

    • 易于添加新模板和参数组
    • 支持复杂的SQL查询
    • 可自定义输出目录和文件命名规则

使用说明

  1. 安装依赖:
pip install cx-Oracle pandas pyyaml openpyxl
  1. 配置文件结构:
project/
├── config/
│   ├── sql_templates.yaml
│   └── parameters.json
├── exports/
├── main.py
  1. 运行程序:
python">python main.py
  1. 输出结果示例:
exports/
├── sales_report_North_2023_Electronics.csv
├── sales_report_North_2023_Electronics.xlsx
├── sales_report_South_2022_Furniture.csv
├── sales_report_South_2022_Furniture.xlsx
├── customer_list_2023-01-01_2023-03-31.csv
├── customer_list_2023-01-01_2023-03-31.xlsx
├── customer_list_2023-04-01_2023-06-30.csv
└── customer_list_2023-04-01_2023-06-30.xlsx

http://www.ppmy.cn/ops/161644.html

相关文章

Java线程池实战:如何避免常见坑点并优化性能?

在使用Java线程池时&#xff0c;避免常见坑点并优化性能是非常重要的。以下是一些关键的实践和建议&#xff0c;帮助你更好地管理和优化线程池的性能。 1. 选择合适的线程池类型 Java提供了几种不同类型的线程池&#xff0c;每种适用于不同的场景&#xff1a; FixedThreadPoo…

形式化数学编程在AI医疗中的探索路径分析

一、引言 1.1 研究背景与意义 在数字化时代,形式化数学编程和 AI 形式化医疗作为前沿领域,正逐渐改变着我们的生活和医疗模式。形式化数学编程是一种运用数学逻辑和严格的形式化语言来描述和验证程序的技术,它通过数学的精确性和逻辑性,确保程序的正确性和可靠性。在软件…

插件化事件处理

以下是一个完整的、可扩展的C++事件处理插件实现,基于先前的功能需求和优化建议。该插件能够灵活地处理不同类型的事件,并支持动态插件注册和卸载。 事件处理插件完整代码 #include <iostream> #include <string> #include <vector>

快手弹幕 websocket 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向分析 import timeimport requests…

Android 布局系列(二):FrameLayout 布局的应用

引言 在安卓开发中&#xff0c;布局管理是构建用户界面的核心之一。对于简单的界面或是需要叠加多个视图的场景&#xff0c;FrameLayout 是一个非常实用的布局容器。它是安卓中最基础的布局之一&#xff0c;能够帮助我们轻松管理多个视图的叠加。尽管它没有复杂的排版功能&…

图数据库Neo4j面试内容整理-使用场景-社交网络

社交网络 是图数据库应用的典型场景之一,因为社交网络本身就具有图结构的特点:人是节点,朋友、关注关系等是关系,而这些节点和关系经常会具有不同的属性。图数据库(如 Neo4j)非常适合存储和查询这些复杂的图数据,可以高效地解决许多社交网络中的查询需求。 1. 社交网络中…

HTML——前端基础1

目录 前端概述 前端能做的事情​编辑 两步完成一个网页程序 前端工具的选择与安装 HTML HTML5介绍 HTML5的DOCTYPE声明 HTML基本骨架 文字标签 标题之标签 标签之段落、换行、水平线 标签之图片 标签之超文本链接 标签之文本 列表标签之有序列表 列表标签之无序…

TensorFlow 快速入门与实战

从0到1掌握TensorFlow&#xff1a;快速入门与实战秘籍 在人工智能的浪潮中&#xff0c;TensorFlow作为一款明星级的开源机器学习框架&#xff0c;正凭借其强大的功能和卓越的性能&#xff0c;成为众多开发者投身AI领域的得力助手。无论是搭建简单的神经网络&#xff0c;还是训…