Recent

Author Topic: SOLVED Sqlite database export  (Read 7582 times)

xinyiman

  • Hero Member
  • *****
  • Posts: 2092
    • Lazarus and Free Pascal italian community
SOLVED Sqlite database export
« on: January 26, 2011, 09:21:39 am »
How can I get a file into the sqlite database structure and related data for possible future re-importation?

For example, I pippo.S3DB the database and I want to extrapolate the structure and contents to be saved in a file named poppo.sql

Thanks for the help
« Last Edit: January 26, 2011, 01:38:06 pm by xinyiman »
Win10, Ubuntu and Mac
Lazarus: 2.1.0
FPC: 3.3.1

Lacak2

  • Guest
Re: Sqlite database export
« Reply #1 on: January 26, 2011, 09:40:39 am »
In Windows you can use backup.bat:
echo .dump | sqlite3.exe pippo.S3DB > poppo.sql

xinyiman

  • Hero Member
  • *****
  • Posts: 2092
    • Lazarus and Free Pascal italian community
Re: Sqlite database export
« Reply #2 on: January 26, 2011, 10:16:01 am »
One crossplatform solution and internal to lazarus, no external process
Win10, Ubuntu and Mac
Lazarus: 2.1.0
FPC: 3.3.1

DirkS

  • Sr. Member
  • ****
  • Posts: 251
Re: Sqlite database export
« Reply #3 on: January 26, 2011, 12:08:02 pm »
There is a lazdbexport component available. It should already be in the lazarus components directory (subdir dbexport).

Gr.
Dirk.

xinyiman

  • Hero Member
  • *****
  • Posts: 2092
    • Lazarus and Free Pascal italian community
Re: Sqlite database export
« Reply #4 on: January 26, 2011, 01:17:41 pm »
Soved with one my unit

unit ExportSqLite;
{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, HTTPSend, sqldb, sqlite3conn,db;

  function EsportaDBSqLiteSuFile(ConnLite: TSQLite3Connection; FlagDati: boolean; NomeFile: string; var Error: string): boolean;

implementation

function EsportaDBSqLiteSuFile(ConnLite: TSQLite3Connection; FlagDati: boolean; NomeFile: string; var Error: string): boolean;
var
   ListaTabelle: TStringList;
   ListaRisultato: TStringList;
   MiaQuery: TSqlQuery;
   ret: boolean;
   i,j: integer;
   Riga, Dati: string;
begin
     ret:=TRUE;
     try
       try
          ListaTabelle:=TStringList.Create;
          ListaRisultato:=TStringList.Create;
          MiaQuery:=TSQLQuery.Create(nil);
          MiaQuery.DataBase:=ConnLite.Transaction.DataBase;

          ConnLite.GetTableNames(ListaTabelle,FALSE);

          { STAMPO SU FILE LA STRUTTURA DELLE TABELLE }
          for i:=0 to ListaTabelle.Count-1 do
          begin
                MiaQuery.SQL.Text:='SELECT * FROM sqlite_master WHERE tbl_name=''' + ListaTabelle.ValueFromIndex + ''';';
                MiaQuery.Open;
                if not MiaQuery.EOF then
                begin
                     MiaQuery.First;
                     While Not MiaQuery.EOF do
                     begin
                          ListaRisultato.Add(StringReplace(MiaQuery.Fields.FieldByName('sql').AsString,'"','', [rfReplaceAll]) + ';');
                          MiaQuery.Next;
                     end;
                end;
                MiaQuery.Close;
          end;
          { STAMPO SU FILE I DATI DELLE TABELLE }
          if FlagDati=TRUE then
          begin
               for i:=0 to ListaTabelle.Count-1 do
               begin
                    MiaQuery.SQL.Text:='SELECT * FROM ' + ListaTabelle.ValueFromIndex + ';';
                    MiaQuery.Open;
                    if not MiaQuery.EOF then
                    begin
                         MiaQuery.First;
                         While Not MiaQuery.EOF do
                         begin
                              Riga:='INSERT INTO ' + ListaTabelle.ValueFromIndex + '(';
                              Dati:='';
                              for j:=0 to MiaQuery.Fields.Count-1 do
                              begin
                                   //stampo il nome del campo
                                   Riga:=Riga + MiaQuery.Fields.Fields[j].DisplayName;

                                   if (j<(MiaQuery.Fields.Count-1)) then
                                      Riga:=Riga + ', '
                                   else
                                       Riga:=Riga + ')VALUES(';

                                   if MiaQuery.Fields.Fields[j].DataType=ftInteger then
                                   begin
                                        //è numerico intero
                                        Dati:=Dati + MiaQuery.Fields.Fields[j].AsString;
                                        if (j<(MiaQuery.Fields.Count-1)) then
                                           Dati:=Dati + ', '
                                        else
                                            Dati:=Dati + ');';
                                   end
                                   else
                                   begin
                                        if MiaQuery.Fields.Fields[j].DataType=ftString then
                                           Dati:=Dati + '''' + StringReplace(MiaQuery.Fields.Fields[j].AsString,'''','''''', [rfReplaceAll]) + ''''
                                        else
                                            Dati:=Dati + '''' + MiaQuery.Fields.Fields[j].AsString + '''';

                                        if (j<(MiaQuery.Fields.Count-1)) then
                                           Dati:=Dati + ', '
                                        else
                                            Dati:=Dati + ');';
                                   end;
                              end;
                              ListaRisultato.Add(Riga+Dati);
                              MiaQuery.Next;
                         end;
                    end;
                    MiaQuery.Close;
               end;
          end;
          { METTO I DATI SU FILE }
          ListaRisultato.SaveToFile(NomeFile);
       finally
              MiaQuery.Free;
              ListaTabelle.Free;
              ListaRisultato.Free;
       end;
     except
           on E: Exception do
           begin
                Error:=E.Message;
                ret:=FALSE;
           end;
     end;
     EsportaDBSqLiteSuFile:=ret;
end;

end.
Win10, Ubuntu and Mac
Lazarus: 2.1.0
FPC: 3.3.1

fabienwang

  • Sr. Member
  • ****
  • Posts: 449
  • Lazarus is the best
    • My blog
Re: SOLVED Sqlite database export
« Reply #5 on: January 26, 2011, 02:47:37 pm »
nice xinyiman, but you don't export the sql that can recreate the sqlite db
(i see no CREATE TABLE with fields).
I'm using Arch Linux.
Known for: CPickSniff, OpenGrabby
Contributed to: LazPaint

xinyiman

  • Hero Member
  • *****
  • Posts: 2092
    • Lazarus and Free Pascal italian community
Re: SOLVED Sqlite database export
« Reply #6 on: January 26, 2011, 06:36:34 pm »
Do not worry, what you say is within the scope of the sql table sqlite_master
Win10, Ubuntu and Mac
Lazarus: 2.1.0
FPC: 3.3.1

 

TinyPortal © 2005-2018