Autore Topic: [Risolto]ottenere un file di dump di un DB SQLite3 da programma  (Letto 839 volte)

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Sto ripercorrendo tutta la gestione DB nel mio programma ed avrei bisogno, all'occorrenza, di scrivere un file di dump (.txt), contenente tutte le tabelle del DB, allo scopo di poterlo utilizzare qualora dovessi ricostruire una o più tabelle, o addirittura, tutto il DB.
Potrei "Far da me" :D, leggendo tutte le tabelle e scaricare il contenuto in file.txt scrivendo all'inizio di ciascun record un campo costante col nome della tabella che scarico, però pensavo ad un file strutturato alla stessa maniera del file di dump che si ottiene in automatico dal gestore manuale di DB-SQLite (in Fedora dispongo di Sqliteman) che produce un file.txt di questo tipo:
Citazione
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE 'RacCodVoci'  ( 'NumVoCassa' INTEGER, 'NumVoColleg' INTEGER,  PRIMARY KEY ( 'NumVoCassa') );
CREATE TABLE 'Movimgg'  ( 'DtMovvgg' INTEGER, 'OraMovvgg' INTEGER, 'NuProMovvgg' BYTE DEFAULT NULL, 'CoVocMovvgg' INTEGER DEFAULT NULL, 'DescrMovvgg' VARCHAR(100) DEFAULT NULL, 'MonMovvgg' CHAR(1) DEFAULT NULL, 'ImpMovvgg' FLOAT DEFAULT NULL, 'BenefMovvgg' CHAR(1) DEFAULT NULL,  PRIMARY KEY ( 'DtMovvgg', 'OraMovvgg') );
CREATE TABLE 'RestaCassagg'  ( 'DtCassagg' INTEGER, 'CoVoResCasgg' INTEGER, 'ValCasgg' CHAR(1) DEFAULT NULL, 'ImpCasgg' FLOAT DEFAULT NULL, PRIMARY KEY ( 'DtCassagg', 'CoVoResCasgg') );
CREATE TABLE 'PartMovv'  ( 'CoVoPartGlob' INTEGER, 'DtCoPartGlob' INTEGER DEFAULT NULL, 'OraPartGlob' INTEGER, PRIMARY KEY ( 'CoVoPartGlob', 'DtCoPartGlob', 'OraPartGlob') );
CREATE TABLE 'PrestMom'  ( 'CoVoPrestMom' INTEGER, 'DtCoPrestMom' INTEGER, 'OraPrestMom' INTEGER, 'StaPrestMom' CHAR(1) DEFAULT NULL, PRIMARY KEY ( 'CoVoPrestMom', 'DtCoPrestMom', 'OraPrestMom') );
CREATE TABLE 'RiepMovMM'  ( 'DtRifMM' INTEGER, 'CoVoMovMM' INTEGER, 'MonMovMM' CHAR(1) DEFAULT NULL, 'ImpMovMM' FLOAT DEFAULT NULL, 'BenefMovMM' CHAR(1) DEFAULT NULL, PRIMARY KEY ( 'DtRifMM') );
CREATE TABLE 'RiepMovg' ( 'DtCoMovg' INTEGER, 'StaDtMovg' CHAR(1), 'TotEntrg' INTEGER DEFAULT NULL, 'TotUscg' INTEGER  DEFAULT NULL, 'RipFing' INTEGER DEFAULT NULL, PRIMARY KEY ('DtCoMovg') );
CREATE TABLE 'GGAperte'  ( 'DtCoGGAp' INTEGER  PRIMARY KEY  );
CREATE TABLE 'ComponFam'  ( 'NuProCompFam' INTEGER, 'NomeCompFam' VARCHAR(20) DEFAULT NULL,  PRIMARY KEY ( 'NuProCompFam') );
INSERT INTO "ComponFam" VALUES(1,'Famiglia');
INSERT INTO "ComponFam" VALUES(2,'Piero');
INSERT INTO "ComponFam" VALUES(3,'Giuseppe');
INSERT INTO "ComponFam" VALUES(4,'Giacomo');
CREATE TABLE 'CausaliFreq'  ( 'DescrCausFreq' VARCHAR(100), 'DtUltCausFreq' INTEGER );
INSERT INTO "CausaliFreq" VALUES('Vitto',20090601);
INSERT INTO "CausaliFreq" VALUES('bar',20090525);
INSERT INTO "CausaliFreq" VALUES('fotografie per tessera mia',20090409);
CREATE TABLE 'PianCont'  ( 'NumVoce'  PRIMARY KEY, 'NomeVoce' VARCHAR(50) DEFAULT NULL, 'ContrPartSiNo' CHAR(1) DEFAULT NULL, 'DtPrimoUso' INTEGER DEFAULT NULL );
INSERT INTO "PianCont" VALUES(10000000,'ATTIVO','N',NULL);
INSERT INTO "PianCont" VALUES(10100000,'CASSA','N',NULL);
INSERT INTO "PianCont" VALUES(10100100,'Emolumenti','N',NULL);
INSERT INTO "PianCont" VALUES(10100101,'Stipendio','N',20100122);
INSERT INTO "PianCont" VALUES(10100102,'Pensione INPS','N',NULL);
Lo scopo è di mantenere lo stesso tipo di struttura per potere eventualmente dare al programma lo stesso tipo di input, sia che il dump si faccia, da Sqliteman che dal programma.
Pensavo perciò ad un comando SQL, perchè, se SQLite3 lo fa, chi meglio di SQLite potrebbe avere già di suo lo strumento necessario per poterlo comandare da programma? Ho guardato però la documentazione di "SQLite SQL Language Syntax Diagrams" http://www.sqlite.org/ e non ho trovato alcuno schema che faccia al caso mio.
Qualcuno ha già sfruttato un'idea del genere e potrebbe accendermi una lampadina?
« Ultima modifica: 06 Marzo 2010, 09:07:18 da Picavbg »
:ciao:

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: ottenere un file di dump di un DB SQLite3 da programma
« Risposta #1 il: 03 Marzo 2010, 10:10:16 »
Dovresti poterlo fare dando da riga di comando qualcosa tipo
Codice: [Seleziona]
dump NOME_FILE_DB '.dump'
.
Cercando su internet ho anche trovato un modo un po' più sofisticato:

Codice: [Seleziona]
echo '.dump' | sqlite3 NOME_FILE_DB | gzip -c >NOME_FILE_DB.dump.gz
In questa maniera hai anche il file risultante già compresso ;-)
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: ottenere un file di dump di un DB SQLite3 da programma
« Risposta #2 il: 04 Marzo 2010, 09:44:06 »
Dovresti poterlo fare dando da riga di comando qualcosa tipo
Codice: [Seleziona]
dump NOME_FILE_DB '.dump'
.
Cercando su internet ho anche trovato un modo un po' più sofisticato:

Codice: [Seleziona]
echo '.dump' | sqlite3 NOME_FILE_DB | gzip -c >NOME_FILE_DB.dump.gz
In questa maniera hai anche il file risultante già compresso ;-)
Quindi dovrei richioamare nel programma la shell con un comando come da esempio tuo.  :-\
Intanto ho provato di eseguire il comandop direttamente nella shell e:
1) Il tuo primo esempio debbo approfondirlo perchè così non funziona, ma tu infatti hai scritto qualcosa tipo ...
2) Siccome il file compresso a me non interessa, ho provato a scrivere:
Codice: [Seleziona]
echo '.dump'| percorso/ContabFam.db /percorso/FileSeq.txt
ma ho sbagliato ragionamento perchè ho ottenuto:
Citazione
bash: percorso/ContabFam.db: cannot execute binary file
Rivedendo però il tuo esempio, ho visto che nel mio comando mancava la parola-chiave "sqlite3"; allora ho ripetuto il comando con la modifica:
Codice: [Seleziona]
echo '.dump'| sqlite3 percorso/ContabFam.db /percorso/FileSeq.txt
ma ho ricevuto la rispostaccia:
Citazione
Error: near "/": syntax error
Dai risultati ottenuti, sembrerebbe che entrambi i comandi abbiano bisogno di qualche parametro aggiuntivo. Devo studiarci un pò sopra.
Comunque, grazie.
Ciao.


:ciao:

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: ottenere un file di dump di un DB SQLite3 da programma
« Risposta #3 il: 04 Marzo 2010, 10:00:35 »
Il mio primo esempio mi pare sbagliato nel senso che doveva essere sqlite3 NOME_DB '.dump'
Per la tua seconda osservazione penso che sia un problema di come hai inserito il percorso del tuo DB. Ma lascia perdere perché il codice qui sopra dovrebbe funzionare.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: ottenere un file di dump di un DB SQLite3 da programma
« Risposta #4 il: 05 Marzo 2010, 09:41:11 »
Grazie Leo, ha funzionato benissimo. Dopo la prima prova ho aggiunto il comando di reindirizzamento su file, in modo da tenerlo sempre disponibile per un'eventuale lettura/trattamento:
Codice: [Seleziona]
/$ sqlite3 percorso/NomeDb '.dump' |  col > percorso/DumpDb.txt
Trovato il comando di produzione del dump, ora devo studiare su come svolegere tutto questo da programma. Mi pare che già esista qualche discussione sull'utilizzo della shell i dentro un programma Gambas. Ti farò sapere. :D :D
Ciao.
:ciao:

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: ottenere un file di dump di un DB SQLite3 da programma
« Risposta #5 il: 05 Marzo 2010, 10:08:04 »
Bellissimo; ce l'ho fatta.  ;D ;D
È stato facilissimo, non immaginavo di ottenere un risultato ottimale in così pochissimo tempo. Ecco l'istruzione inserita in prova nel programma:
Codice: [Seleziona]
SHELL ("sqlite3 percorsoinput/ContabFam.db '.dump'|  col > percorsooutput/DumpDb.txt") 
Non mi resta che posizionarla nel punto giusto.
Grazie, grazie, grazie!
 ;D ;D
Ciao ancora.
 
:ciao:

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: ottenere un file di dump di un DB SQLite3 da programma
« Risposta #6 il: 05 Marzo 2010, 10:08:44 »
Una semplice soluzione è quella di richiamare quel comando così:

Codice: [Seleziona]
SHELL ("sqlite3 percorso/NomeDb '.dump' |  col > percorso/DumpDb.txt") WAIT

Con il WAIT finale ti assicuri che il controllo non torni a Gambas fintanto che quel comando non è stato eseguito. Puoi magari anche metterci un "TRY" davanti e controllare un eventuale errore dopo così da assicurarti che tutto sia filato liscio:

Codice: [Seleziona]
TRY SHELL ("sqlite3 percorso/NomeDb '.dump' |  col > percorso/DumpDb.txt") WAIT
IF ERROR THEN
  Message.Warning("Attenzione! Errore!")
ENDIF
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: ottenere un file di dump di un DB SQLite3 da programma
« Risposta #7 il: 05 Marzo 2010, 13:30:21 »
Codice: [Seleziona]
TRY SHELL ("sqlite3 percorso/NomeDb '.dump' |  col > percorso/DumpDb.txt") WAIT
IF ERROR THEN
  Message.Warning("Attenzione! Errore!")
ENDIF

Meglio ancora sarebbe

Codice: [Seleziona]
TRY SHELL ("sqlite3 percorso/NomeDb '.dump' |  col > percorso/DumpDb.txt") WAIT
IF ERROR THEN
  Message.Warning("Errore")
  PRINT Error.Text
ENDIF

Così nel terminale ti scrive per bene l'errore preciso che si è presentato...

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: ottenere un file di dump di un DB SQLite3 da programma
« Risposta #8 il: 06 Marzo 2010, 09:06:38 »
Ottimo consiglio. Grazie a tutti.
Ciao.
:ciao: