首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

使用 Python cx_Oracle 模組將 Oracle 資料匯出至 CSV 檔案的完整指南

     編輯:更多程式設計知識

本文詳細介紹如何使用 Python 的 cx_Oracle 模組連接 Oracle 資料庫,並將所有使用者資料表的資料匯出為獨立的 CSV 檔案。這對於資料備份、遷移或離線分析非常實用。

前置準備

  • 已安裝 Python 環境(建議 3.6+)
  • 已安裝 Oracle Instant Client 並配置環境變數
  • 透過 pip install cx_Oracle 安裝驅動模組

核心程式碼實作

import sys
import csv
import cx_Oracle

def export_oracle_to_csv():
    # 1. 取得連線字串(格式:user/password@host:port/service_name)
    conn_str = input("請輸入 Oracle 連線字串 (uid/pwd@database): ").strip()
    if not conn_str:
        print("連線字串不可為空")
        return

    try:
        # 2. 建立連線與游標
        conn = cx_Oracle.connect(conn_str)
        cursor = conn.cursor()

        # 3. 查詢所有使用者資料表(排除回收筒物件)
        cursor.execute("SELECT table_name FROM user_tables")
        tables = [row[0] for row in cursor if not row[0].startswith('BIN$')]

        print(f"共發現 {len(tables)} 個資料表,開始匯出...")

        # 4. 逐表匯出
        for table_name in tables:
            csv_filename = f"{table_name}.csv"
            with open(csv_filename, 'w', newline='', encoding='utf-8') as f:
                writer = csv.writer(f, dialect='excel')

                # 4.1 寫入欄位標題
                col_cursor = conn.cursor()
                col_cursor.execute(f"SELECT * FROM {table_name} WHERE ROWNUM = 0")  # 僅取結構
                headers = [col[0] for col in col_cursor.description]
                writer.writerow(headers)

                # 4.2 寫入資料列
                data_cursor = conn.cursor()
                data_cursor.execute(f"SELECT * FROM {table_name}")
                for row in data_cursor:
                    writer.writerow(row)
                data_cursor.close()
                col_cursor.close()

            print(f"✅ {table_name} -> {csv_filename} 匯出完成")

    except cx_Oracle.DatabaseError as e:
        print(f"資料庫錯誤: {e}")
    except Exception as e:
        print(f"發生未預期錯誤: {e}")
    finally:
        if 'conn' in locals() and conn:
            conn.close()
            print("資料庫連線已關閉")

if __name__ == "__main__":
    export_oracle_to_csv()

關鍵點解析

  1. 連線字串格式:支援 EZConnect 格式(如 scott/tiger@localhost:1521/orcl)或 TNS 別名。
  2. 排除回收筒:BIN$ 開頭的表為刪除後暫存物件,無需匯出。
  3. 高效寫入:使用 newline='' 避免 Windows 下多出空行;encoding='utf-8' 確保中文不亂碼。
  4. 資源管理:採用 with open 並顯式關閉游標,防止連線洩漏。

常見問題

  • ORA-12154 / ORA-12541:檢查 Oracle Client 安裝、tnsnames.ora 設定、防火牆及監聽器狀態。
  • 大量資料效能:若單表超過百萬列,建議改用 cursor.arraysize 批次提取,或使用 Oracle 原生工具(Data Pump、SQLcl)。
  • 欄位型別處理:cx_Oracle 會自動將 DATE、TIMESTAMP、CLOB 等轉為 Python 對應型別,CSV 寫入時會自動轉字串;若需特定格式,可在寫入前自行格式化。

此腳本提供一個開箱即用的基礎框架,可依專案需求擴充:支援指定 Schema、並行匯出、壓縮輸出、上傳至雲端儲存等。善用 Python 豐富的生態系,能大幅簡化 Oracle 資料匯出作業。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved