IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Delphi Discussion :

[XE Berlin] Migration de MySQL vers SQLite : copier les structures de tables


Sujet :

Bases de données Delphi

  1. #1
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 765
    Points : 959
    Points
    959
    Par défaut [XE Berlin] Migration de MySQL vers SQLite : copier les structures de tables
    Bonjour,

    Je maîtrise la migration des données des tables de MySQL vers SQLite en utilisant l'excellent TFDBatchMove quand les structures des tables existent dans la base SQLITE, avec un TFDQuery de chaque côté.

    Mon problème est que j'aurais voulu créer de toute piéce une base Sqlite et du coup, je me trouve devant la question de comment recréer les structures.

    Avez-vous une idée ?

  2. #2
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 765
    Points : 959
    Points
    959
    Par défaut
    J'ai bien fait une tentative avec TFDQuery.CopyDataset mais visiblement ce n'est pas la bonne approche…

    Une idée ?

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    sur d'autres SGBD, je me suis déjà posé la même question sans toutefois aller trop loin (faute de temps). La clé : métadonnées
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 765
    Points : 959
    Points
    959
    Par défaut
    J'utilise déjà GetTableNames pour lister les tables, pour recréer les structures de tables je n'ai pas trouver de méthode exploitable hélas…

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Si tu as déjà trouvé GetTableNames alors tu as aussi trouvé GetFieldNames
    ensuite (théoriquement car j'en était rendu là) on peut obtenir les informations sur la colonne.
    Solution SQL :
    Reste (et quand je dit reste il y a du boulot ) à établir une correspondance type de champ de la source vers type de champ de la destination (dans une liste d'objets par exemple ?) et à partir de ça reconstruire la table
    Solution Code :
    AMHA, dans les sources de Firedac il y a déjà cette liste, une autre solution serait peut être de créer des tables vides puis d'utiliser la création de champs (j'utilise ce nom à dessein pour distinguer des colonnes SQL) et laisser Firedac gérer les équivalence de type. en fouillant du coté de FieldDefList coté source et FieldDefs.Add coté destination. Cela ne fera pas tout il y aura encore les index, les contraintes etc... mais c'est un début
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 299
    Points
    11 299
    Billets dans le blog
    6
    Par défaut
    Dans les bases SQLite, on retrouve les requêtes créant les tables. Je ne connais pas MySQL et ne suis pas sûr que la même chose, bien pratique, existe.
    Pour SQLite : https://sqlite.org/fileformat2.html au 2.6 :
    The sqlite_master.sql column stores SQL text that describes the object. This SQL text is a CREATE TABLE, CREATE VIRTUAL TABLE, CREATE INDEX, CREATE VIEW, or CREATE TRIGGER statement that if evaluated against the database file when it is the main database of a database connection would recreate the object. The text is usually a copy of the original statement used to create the object but with normalizations applied so that the text conforms to the following rules:
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    @Tourlourou
    Bonjour,
    je pense que tu n'as pas saisi le besoin : On a une base Mysql et on veut transférer son contenu dans une base créée (ou pas d'ailleurs), mais totalement vide (pas de table).
    L'objectif est donc de créer les tables et donc les colonnes de celle-ci à partir des éléments de la base MySQL. Le hic c'est que la syntaxe entre les deux SGBD n'étant pas forcément le même on court assez vite droit dans le mur en extrayant (avec un GUI quelconque) les métadonnées de la base source pour appliquer le script obtenu avec le SGBD cible. D'où le recours à Firedac et les métadonnées obtenues grâce à ces composants.

    @der§en
    j'ai retrouvé mes essais pour listé les colonnes via Firedac et un FDMetaInfoQuery (fdMetaInfoQuery.ObjectName:=<nom de la table>,fdMetaInfoQuery.metainfokind:=mkTableFields)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TForm8.FDMetaInfoQuery1FilterRecord(DataSet: TDataSet;
      var Accept: Boolean);
    var i : Integer;
        eAttr : TFDDataAttributes;
    begin
    i:=FDMetaInfoQuery1.FieldByName('COLUMN_ATTRIBUTES').asInteger;
    eAttr:=TFDDataAttributes(Pointer(@i)^);
    Accept:=not  (caCalculated in eattr);  // ne prend pas en compte les champs calculés 
    end;
    pour obtenir cela j'avais beaucoup fouillé dans le source Firec.Stan.intf. Je m'étais arrêté là en fait.
    Une question, car je n'ai jamais essayé :
    Citation Envoyé par der§en
    Je maîtrise la migration des données des tables de MySQL vers SQLite en utilisant l'excellent TFDBatchMove
    même les blobs ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #8
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 299
    Points
    11 299
    Billets dans le blog
    6
    Par défaut
    Effectivement, le SQL créant une table MySQL n'est pas forcément directement utilisable dans SQLite, même si on peut le récupérer aisément avec un SHOW CREATE TABLE tbl_name.
    Même si SQLite interprète certains types de colonnes, disposant de moins de variété de types.
    Il peut donc effectivement y avoir des difficultés à vouloir créer une base SQLite avec le code MySQL sans le retravailler, en vue d'un BatchMove.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  9. #9
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 765
    Points : 959
    Points
    959
    Par défaut
    Merci de vos réponses, en creusant un peu plus la question, je suis arrivé a une solution simple et fonctionnelle a part un petit détail.

    J'ai déjà commencé par remplacé mes 2 TFDQuery par 2 TFDTable.

    Ensuite, pour copier la structure d'une table issus de la liste des tables MySQL obtenu grâce a GetTableNames, j'ai attribué au Premier TFDTable la table sous MySQL et je l'ai ouvert, puis j'ai attribué a la table de destination dans la base SQLite (qui n'existe pas encore), les FieldDefs de la première table.

    Puis basiquement, j'ai fait un CreateTable, suivi d'une ouverture de cette table, il ne me restait ensuite qu'a utiliser mon TFDBatchMove pour copier la table MySQL vers SQLite:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        FDTableSQLite.FieldDefs := FDTableMySQL.FieldDefs;
        FDTableSQLite.TableName := ListBox2.Selected.Text;
        FDTableSQLite.CreateTable(True, [tpTable, tpPrimaryKey, tpIndexes]);
        FDTableSQLite.Open;
    Avec ces 4 lignes de codes, je copie la structure et j'ouvre la nouvelle table.

    Que de temps perdu a cause d'une documentation inexistante sous Delphi quand même

    Reste le truc qui me pose un soucis, c'est que le nom de la table est automatiquement mis en MAJUSCULE dans la base SQLite, ce qui n'est pas le cas dans la base MySQL, quelqu'un sait comment pallier a ceci ?

  10. #10
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 765
    Points : 959
    Points
    959
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    pour obtenir cela j'avais beaucoup fouillé dans le source Firec.Stan.intf. Je m'étais arrêté là en fait.
    Une question, car je n'ai jamais essayé :

    même les blobs ?
    Pas encore eu ce cas de figure, je vais faire un test pour voir.

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/03/2007, 10h53
  2. Migration de Mysql vers Sql Server
    Par bluecurve dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 06/02/2007, 00h21
  3. Migration MySQL vers SQLite
    Par fadeninev dans le forum Outils
    Réponses: 14
    Dernier message: 24/11/2006, 09h25
  4. Re besoin de vous pour migration de mysql vers dsl server
    Par scaleo dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 07/11/2006, 13h45
  5. [SGBD] Migration de mysql vers PostgreSQL ?
    Par haffouff dans le forum SQL Procédural
    Réponses: 12
    Dernier message: 25/05/2006, 15h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo