2010-09-23 5 views
9

Abbiamo lavorato sodo per elaborare un modello di database completo del nostro problema, e ora è il momento di iniziare la codifica. I nostri precedenti progetti hanno utilizzato query realizzate a mano costruite mediante manipolazione di stringhe.Python: interagire con il data warehouse complesso

Esiste la migliore/pratica standard per l'interfaccia tra Python e un layout di database complesso?

Ho valutato brevemente SQLAlchemy, SQLObject e Django-ORM, ma (potrei facilmente mancare qualcosa) sembrano sintonizzati per transazioni di tipo minuscolo web (OLTP), dove sto eseguendo analisi analitiche ad alto volume (OLAP) transazioni.

Alcune delle mie esigenze, che possono essere un po 'diverso dal solito:

  1. carico di grandi quantità di dati in tempi relativamente brevi
  2. aggiornamento/inserimento di piccole quantità di dati in modo rapido e semplice
  3. gestire un gran numero di righe facilmente (300 voci al minuto su 5 anni)
  4. consentire modifiche allo schema, per esigenze future

Scrivere queste query è facile, ma scrivere il codice per ottenere i dati allineati è noioso, specialmente con lo sviluppo dello schema. Questo sembra qualcosa a cui un computer potrebbe essere bravo?

+1

Aggiungo questo come commento, ma in genere gli ORM vengono utilizzati per OLTP e tentare di eseguire il pattinamento in un magazzino dati è di solito più difficile di quanto valga. – nos

+0

Mentre gli ORM possono essere utilizzati per gli OLTP, possono anche semplificare alcuni tipi di elaborazione del data warehouse. La maggior parte delle query DW ** dovrebbero ** essere semplici operazioni 'seleziona somma/conteggio e raggruppamento '. Avere questi generati da uno strumento ORM può essere un grande risparmio di tempo. –

+0

Le query verranno generate dagli utenti finali? Quale interfaccia stai fornendo e quali livelli di libertà? – shmichael

risposta

2

SQLAlchemy sicuramente. Rispetto a SQLAlchemy, tutti gli altri ORM assomigliano al giocattolo di un bambino. Soprattutto il Django-ORM. Che cos'è Hibernate to Java, SQLAlchemy è per Python.

+0

Ho provato a imparare l'ORM SA tre volte e ogni volta vengo contro errori completamente bizzarri che non mi fanno desiderare di toccarlo mai più. Come l'hai imparato? – bukzor

+0

documentazione e codifica. – dekomote

+0

"errori completamente bizzarri" o "supposizioni mie che si sono rivelate false su SA"? Spesso facciamo delle supposizioni, scopriamo che il software non corrisponde alle nostre ipotesi e chiamiamo il tutto "bizzarro". Senza dettagli, è impossibile valutare la tua affermazione. Se hai problemi, per favore pubblicali come domande. –

6

Non essere confuso dalle vostre esigenze. Una taglia non va bene per tutti.

carico di grandi quantità di dati in tempi relativamente brevi

Perché non utilizzare caricatori nativo del database per questo? Usa Python per preparare i file, ma usa gli strumenti del database da caricare. Scoprirai che questo è incredibilmente veloce.

aggiornamento/inserimento di piccole quantità di dati in modo rapido e semplice

che inizia a piegare le regole di un data warehouse. A meno che tu non stia parlando di Master Data Management per aggiornare gli attributi di reporting di una dimensione.

Ecco a cosa servono i sistemi ORM e Web.

gestire un gran numero di righe facilmente (300 voci al minuto oltre 5 anni)

Anche in questo caso, è per questo che si utilizza una pipeline di Python elaborazione front-end, ma l'INSERT attuale sono fatto da base di dati utensili. Non Python.

alter schema (insieme con l'interfaccia di pitone) in modo semplice, per esigenze future

hai quasi nessun uso per automatizzare questo. È sicuramente il tuo compito più basso per la "programmazione".Lo farai spesso manualmente per preservare i dati correttamente.

BTW, "le query create a mano costruite mediante manipolazione di stringhe" è probabilmente l'errore più grande di sempre. Questi sono difficili da gestire per il parser RDBMS: sono più lenti rispetto all'utilizzo di query contenenti variabili di bind inserite.

+0

Grazie. Quello che intendevo con "alter" era "non bloccare lo schema". Molte volte quando si interagisce con un database, si raggiunge una certa soglia di linee di codice da modificare dove non vale più la pena di modificare lo schema. Mi piacerebbe evitare questa situazione interamente se possibile. – bukzor

+0

Durante il caricamento nel database, come gestisci i nuovi dati che si sovrappongono al vecchio? O semplicemente carichi tutti i dati ogni volta? Ciò sembra proibitivo inefficiente. – bukzor

+0

@bukzor: Data Warehouse (quasi sempre) significa solo inserimento. Nuovi dati --- per definizione - è * nuovo * e non * si sovrappongono * al vecchio. Potrebbe condividere alcune chiavi comuni, ma è * nuovo *. Prima di procedere, trova una copia di Kimball's The Data Warehouse Toolkit. –

3

Sto usando SQLAlchemy con un datawarehouse piuttosto grande e lo sto usando per il processo ETL completo con successo. Specialmente in alcune fonti in cui ho alcune regole di trasformazione complesse o con alcune fonti eterogenee (come i servizi web). Non sto usando l'ORM Sqlalchemy, ma piuttosto usando il suo linguaggio di espressione SQL perché non ho davvero bisogno di mappare nulla con gli oggetti nel processo ETL. Vale la pena notare che quando porto una copia letterale di alcune delle fonti, preferisco usare gli strumenti db per questo, come l'utility dump PostgreSQL. Non puoi batterlo. SQL Expression Language è la soluzione più vicina a SQLAlchemy (o qualsiasi altro ORM per la materia) per scrivere a mano SQL, ma poiché è possibile generare in modo programmatico SQL da Python risparmierai tempo, specialmente se hai delle regole di trasformazione davvero complesse da seguire.

Una cosa però, piuttosto modifico il mio schema a mano. Non mi fido di nessuno strumento per quel lavoro.

+0

+1: "modifica il mio schema a mano".È troppo difficile scrivere uno strumento per questo: troppi casi speciali. –

+0

hai i sorgenti e i target sullo stesso server? – hugo24

+0

Fammi vedere ...: una fonte è nello stesso server, e altre tre fonti sono in tre server diversi (due postgresql, 1 mysql e 1 oracle sono le mie fonti). Inoltre sto raccogliendo dati da Salesforce SOAP WS e dati da alcune Google Apps (Analytics e Calendar). – Mariano