>>>>> 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