# CLAUDE.md — ParquetToAccess **Ultimo aggiornamento:** 2026-04-10 ## Scopo Convertitore centralizzato Parquet → MS Access. Legge Parquet via DuckDB, scrive tabelle in Access via pyodbc. Config-driven — ogni conversione è una entry in `exports.json`. **Strato legacy temporaneo** — esiste finché i consumer Access non vengono migrati a Parquet. Obiettivo finale: spegnere Access del tutto. **Ambiente:** gira sulla macchina DS (Direzione Sistemi), Python `C:\venv_ICR\Scripts\python.exe`. Richiede MS Access Application installato (non solo ODBC driver) per l'enrichment. ## Architettura ``` main.py → legge config/exports.json → per ogni job: core/exporter.py → DuckDB legge source.parquet → pyodbc scrive tabella in target.accdb (DROP + CREATE + INSERT batch) ``` ## Struttura ``` ParquetToAccess/ ├── main.py # CLI: python main.py [--job nome] ├── config/ │ └── exports.json # definisce jobs: source → target → table ├── core/ │ ├── exporter.py # logica DuckDB → pyodbc │ └── schema.py # mapping tipi DuckDB → Access └── CLAUDE.md ``` ## exports.json — formato job ```json { "name": "nome_univoco", "source": "path\\al\\file.parquet", "target": "path\\al\\file.accdb", "table": "NOME_TABELLA_ACCESS", "mode": "replace", // replace = drop+create+insert | append = solo insert "columns": ["COL1", "COL2"], // opzionale — default: tutte le colonne Parquet "column_map": {"COL_ACCESS": "col_parquet"} // opzionale — rinomina colonne } ``` ## Job attivi | Job | Source | Target | Tabella | |---|---|---|---| | gemma_to_db_day | gemma.parquet | DB_DAY.accdb | GEMMA | | osservatorio_to_db_day | osservatorio.parquet | DB_DAY.accdb | SCHEDA_PRODOTTO | ## Dipendenze - `duckdb` — lettura Parquet - `pyodbc` — scrittura Access - Microsoft Access Driver (*.mdb, *.accdb) — ODBC driver, deve essere installato ## Gotcha - **DAO non funziona su UNC** — usare sempre pyodbc (non COM/DAO) per path di rete - **mode=replace** fa DROP TABLE + CREATE TABLE + INSERT — la struttura viene ricreata ogni volta - **CHUNK_SIZE=5000** — batch insert per evitare timeout su tabelle grandi - **DATE → DATETIME** — Access non ha tipo DATE puro via ODBC, coerce_value() converte