Copier des tables MySQL vers SQLite

Pour des besoins de migration des bases de données MySQL vers SQLite, j’ai fait quelque tests du composant Firedac TFDBatchMove avec une grande satisfaction.

J’ai codé mon test sous Delphi avec le Framework Firemonkey plutôt que la VCL.

Dans mes premiers essais, le soucis que j’ai rencontré est qu’il fallait impérativement que les structures des tables (à l’identique) existe aussi bien sous MySQL et sous SQLite.

Du coup, j’ai cherché comment partir dans une base SQLite vierge en créant de toute pièce les tables depuis MySQL.

Cela a été faisable en remplaçant les TFDQuery utilisé précédemment par des TFDTable, ce qui m’a permis d’utiliser pleinement la richesse de Firedac.

Voici (le code intégral a consulter dans le fichier ZIP) la copie de toute les tables d’une base MySQL vers une base SQLite fraîchement créé sans connaître d’avance les structure des tables, le tout directement par code, pour mon exemple, je n’ai fait que poser les composants suivant sur le TForm dans Delphi:

  • TFDBatchMove.
  • TFDTable.
  • TFDConnection.
  • TFDBatchMoveDataSetWrtier.
  • TFDBatchMoveDataSetReader.
  • TFDPhysSQLiteDriverLink.
  • TFDPhysMySQLDriverLink.

L’essentiel du code contenu dans le ZIP :

  // Initialisation MySQL
  FDConnectionMySQL.Params.Clear;
  FDConnectionMySQL.DriverName      := 'MySQL';
  FDConnectionMySQL.Params.DriverID := 'MySQL';
  FDConnectionMySQL.Params.UserName := 'mon-utilisateur';
  FDConnectionMySQL.Params.Password := 'mot-de-passe';
  FDConnectionMySQL.Params.Database := 'mon-de-la-base';
  FDConnectionMySQL.LoginPrompt     := False;
 
  // Parametres spécifique a MySQL.
  FDConnectionMySQL.Params.Values['Server'] := 'adresse-ip-du-serveur-';
  FDConnectionMySQL.Params.Values['CharacterSet'] := 'utf8';
 
  // Initialisation SQLite
  FDConnectionSQLite.Params.Clear;
  FDConnectionSQLite.DriverName      := 'SQLite';
  FDConnectionSQLite.Params.DriverID := 'SQLite';
  FDConnectionSQLite.Params.UserName := '';
  FDConnectionSQLite.Params.Password := '';
  FDConnectionSQLite.Params.Database := FDConnectionMySQL.Params.Database + formatdatetime('-dd-mm-yyyy', Now) + '.db';
  FDConnectionSQLite.LoginPrompt     := False;
 
  FDConnectionSQLite.Connected := True;
  FDConnectionMySQL.Connected  := True;
 
  tmpTable := TFDTable.Create(nil);
  try
    // Initialisation de la connection MySQL
    FDTableMySQL.Connection := FDConnectionMySQL;
    FDTableMySQL.TableName  := ListBox2.Selected.Text;
    FDTableMySQL.Open;
 
    // Initialisation de la connection SQLite.
    tmpTable.Connection := FDConnectionSQLite;
    tmpTable.FieldDefs  := FDTableMySQL.FieldDefs;
    tmpTable.TableName  := ListBox2.Selected.Text;
    tmpTable.CreateTable(True, [tpTable, tpPrimaryKey, tpIndexes]);
    tmpTable.Open;
 
    // lie les tables pour le BatchMove.
    FDBatchMoveDataSetReaderMySQL.DataSet  := FDTableMySQL;
    FDBatchMoveDataSetWriterSQLite.DataSet := tmpTable;
 
    // Defini les composants de lecture/écriture.
    FDBatchMoveMySQLtoSQLite.Reader := FDBatchMoveDataSetReaderMySQL;
    FDBatchMoveMySQLtoSQLite.Writer := FDBatchMoveDataSetWriterSQLite;
 
    try
      // Défini le mode de copie
      FDBatchMoveMySQLtoSQLite.Mode := dmAppendUpdate;
 
      // Excute la copie
      FDBatchMoveMySQLtoSQLite.Execute;
 
      // Referme les tables.
      FDTableMySQL.Close;
      tmpTable.Close;
    except
      on E: EFDDBEngineException do
        ShowMessage('MySQLtoSQLite : ' + E.Message);
    end;
  finally
    tmpTable.Free;
  end;

L’avantage de cette approche est que vous pouvez vous en servir pour faire des sauvegarde de vos bases MySQL sans faire intervenir soit un administrateur système ou bien un administrateur de base de données.

Grâce au composant TFDBatchMove vous pourriez faire aussi simplement la manipulation contraire, c’est dire migrer une base SQLite vers une base MySQL !

On m’a posé la question de savoir si cela fonctionnait aussi pour les Blobs et après quelques tests, je peux répondre par l’affirmative…

Voici le source de mon projet pour faire vos tests (fait sous Delphi XE Berlin) :

MySQLtoSQLIte
MySQLtoSQLIte
MySQLtoSQLIte.zip
Version: 1.0
11.9 KB
5 Downloads
Détails

Laisser un commentaire