Linuxtrent: Re: Dubbio di forma (programmando in C)

  • From: Lele Gaifax <lele@xxxxxxxxxx>
  • To: linuxtrent@xxxxxxxxxxxxx
  • Date: Wed, 2 May 2001 16:59:33 +0200

>>>>> On Wed, 2 May 2001 15:21:32 +0200, Daniele Nicolodi <daniele@xxxxxxxxxx> 
>>>>> said:

    DN> On Wed, May 02, 2001 at 02:44:03PM +0200, Lele Gaifax wrote:
    >>  Centro! Anche se pure il Pascal usa quella sintassi per dire
    >> "diverso", ultimamente ho speso del tempo per "embeddare" il
    >> Python nelle mie applicazioni Delphi, cosa che sognavo da
    >> parecchio :-)

    DN> Non ho capito ... ho forse ho capito e non ci credo: ti sei
    DN> scritto un wrapper tra pascal e python ??  Non saprei nemmeno
    DN> da che parte cominciare ...

Esiste già un fantastico "wrapper" Python per Delphi: è difficile
stabilire se sia uno che incorpora l'altro o viceversa, tant'è che
instanziando un TPythonEngine su una form Delphi, gli fai eseguire il
codice voluto, ma è ovviamente un esempio stupido; l'integrazione tra
i due si spinge molto più in là, e di fatto puoi attaccare degli
"event handler" scritti in Python a oggetti Delphi :-) Oppure la form
Delphi implementa anche un modulo Python, ad esempio per esporre
qualche funzionalità particolare, accessibile da Python col solito
"import ModuloDellaForm"....

    >> La prima è fatta: si tratta di una applicazione che mi serve
    >> per "patchare" un database, per aggiornarne la struttura e/o i
    >> dati, in buona sostanza una collezione di script SQL da
    >> eseguire nell'ordine stabilito. In SQL (Interbase) non è
    >> praticamente possibile fare un certo numero di cose carine,
    >> tipo "disabilitami tutti gli indici della tabella X". In un
    >> paio d'ore ho fatto in modo che i miei script possano essere
    >> scritti anche in Python, nel qual caso il programmillo viene
    >> eseguito e, se tutto va bene, il suo prodotto sarà il codice
    >> SQL da mandare al server :-) Sono entusiasta del lavoro, e devo
    >> ancora comprenderne a fondo le potenzialità !-)

    DN> Nemmeno qui` capisco: ho scritto na roba che prende funzioni
    DN> in phyton e le "compila" in SQL o un modulo python che ti
    DN> permette di eseguire codice SQL sul database ??

Non precisamente: l'SQL di IB (ed in generale l'SQL non assistito da
"fronzoli" 4GL e/o procedurali) non è introspettivo, nel senso che non
posso fare una cosa se è vera una condizione, o un'altra se non lo
è. Prendi ad esempio gli indici delle tabelle: per svariate ragioni,
potresti volerli disattivare, per essere ultrarapido a caricare dati
in batch, e poi riattivarli. Questo si traduce in una serie di
istruzioni SQL del tipo

ALTER INDEX nome_indice_1 INACTIVE;
ALTER INDEX nome_indice_2 INACTIVE;
ALTER INDEX nome_indice_3 INACTIVE;
ALTER INDEX nome_indice_4 INACTIVE;

(per lo meno in IB) non ho modo di "loopare" su tutti gli indici di
una tabella, o se per quello su tutti gli indici del DB, ed eseguire
una istruzione cosi.

Avendo a disposizione il Python, la mia applicazione, con tutta la sua
macchineria di accesso al DB, espone in un modulo Python chiamato
"DatabaseSchema", che mi consente di riscrivere quanto sopra come

#!python

import DatabaseSchema

for nome in DatabaseSchema.IndexNames():
    print "ALTER INDEX %s INACTIVE;" % nome

Quando trova la signature "#!python", l'applicazione esegue lo script,
ottenendo il suo output, ed è quello che viene spedito al server DB.

Ora che ho quella funzionalità, potrò andare ancora più sull'elegante,
creandomi una serie di classi Python che mi nascondano completamente
l'SQL, e che "mappino" ogni oggetto del mio DB, quindi avere un
oggetto "PythonSQLTable", contenente tutti gli attributi del caso
(lista dei campi, degli indici, dei constraint...), tale che facendo

tab = PythonSQLTable (createFrom="QUALCHETABELLA")
campo = PythonSQLField (name="NUOVO", type="VARCHAR(10)")
tab.AddField (campo)
tab.DropField ('VECCHIO')
print tab.Apply()

otterrei

ALTER TABLE QUALCHETABELLA
DROP VECCHIO,
ADD NUOVO VARCHAR(10);

Se ora immagini di dover sostituire in tutte le tabelle che hai il
campo "VECCHIO" con quello "NUOVO", è semplice vedere come questo
approccio sia VINCENTE!

spero di averti chiarito un pochino...
ciao, lele.
-- 
nickname: Lele Gaifax   | Quando vivro' di quello che ho pensato ieri
real: Emanuele Gaifas   | comincero' ad aver paura di chi mi copia.
email: lele@xxxxxxxxxx  |               -- Fortunato Depero, 1929.

-- 
Per iscriversi  (o disiscriversi), basta spedire un  messaggio con SOGGETTO
"subscribe" (o "unsubscribe") a mailto:linuxtrent-request@xxxxxxxxxxxxxxxxx


Other related posts: