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