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

Doctrine2 PHP Discussion :

[Data fixtures] Contraintes d'intégrité


Sujet :

Doctrine2 PHP

  1. #1
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 774
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 774
    Par défaut [Data fixtures] Contraintes d'intégrité


    Me remettant à Sf2, je coince sur un problème : j'ai des entités avec des contraintes d'intégrité et des fixtures à y charger. Le problème, c'est que je ne peux pas simplement charger mes fixtures en vidant ma table, je ne peux que les ajouter à la fin...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ app/console doctrine:fixtures:load
      > purging database
     
      [PDOException]
     
      SQLSTATE[42000]: Syntax error or access violation: 1701 Cannot truncate a tabl
    e referenced in a foreign key constraint (`symfony`.`category`, CONSTRAINT `cate
    gory_ibfk_1` FOREIGN KEY (`rubrique_id`) REFERENCES `symfony`.`rubrique` (`id`))
    Si j'ajoute le paramètre --append, ça fonctionne sans problème, mais ce n'est pas ce que je veux faire...

    Mon entité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    <?php
     
    namespace Quiz\QuizBundle\Entity;
    use Doctrine\ORM\Mapping as ORM;
    use Doctrine\Common\Collections\ArrayCollection;
     
    /** 
     * @ORM\Entity
     */
    class LogCategory
    {
        /**
         * @ORM\Column(type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue
         */
        protected $id; 
     
        /**
         * @ORM\OneToMany(targetEntity="Log", mappedBy="category")
         */
        protected $logs;
     
        /**
         * @ORM\Column(type="string")
         *
         * Nom de la catégorie
         */
        protected $name; 
     
        public function __construct()
        {
            $this->logs = new ArrayCollection();
        }
     
        // getters et setters automatiquement définis
    }
    J'utilise MySQL 5.5 via PDO, Sf2 en beta 4 et Doctrine Data Fixtures Extension.

    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Par défaut
    Apparemment, l'option append fait que tu ajoutes les données quand tu charges tes fixtures, au lieu de vider d'abord les tables puis charger les fixtures.

    Donc la requête Truncate est appelée par défaut pour vider les tables. Vu le log, il faut que puisses ordonner le vidage des tables car tu essayes de vider une table alors qu'une autre non vidée a encore une référence qui pointe vers la première.

    PS: il semble que tu vides ta table de catégories avant ta table de logs, or il y a une référence sur la colonne category.

  3. #3
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 774
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 774
    Par défaut
    Citation Envoyé par pc.bertineau Voir le message
    tu essayes de vider une table alors qu'une autre non vidée a encore une référence qui pointe vers la première.
    Le problème, c'est que j'ai en tout et pour tout un seul enregistrement en base, la catégorie, dans la table sur laquelle je tente de lancer un TRUNCATE, justement !

    En passant, avec PhpMyAdmin, quand je fais un vidage de la table, les autres restant à zéro enregistrement, ça ne fonctionne pas non plus...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cannot truncate a table referenced in a foreign key constraint (`symfony`.`log`, CONSTRAINT `log_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `symfony`.`logcategory` (`id`))
    Problème dans la définition d'une entité, donc dans le schéma de la base ?
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Par défaut
    Bizarre ! Problème de mapping sans doute... Est-ce que la requête qui plante (truncate ...) est juste ?

  5. #5
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 774
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 774
    Par défaut
    Citation Envoyé par pc.bertineau Voir le message
    Bizarre ! Problème de mapping sans doute... Est-ce que la requête qui plante (truncate ...) est juste ?
    C'est la même que produit phpMyAdmin et que je ferais moi sans ORM...

    Le mapping pour l'autre entité concernée, Log :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    <?php
     
    namespace Quiz\QuizBundle\Entity;
    use Doctrine\ORM\Mapping as ORM;
     
    /** 
     * @ORM\Entity
     */
    class Log
    {
        /**
         * @ORM\Column(type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue
         */
        protected $id; 
     
        /**
         * @ORM\ManyToOne(targetEntity="LogCategory", inversedBy="logs")
         */
        protected $category;
     
        /**
         * @ORM\ManyToOne(targetEntity="User", inversedBy="logs")
         */
        protected $who; 
     
        /**
         * @ORM\Column(type="integer")
         *
         * Identifiant de l'objet changé (type d'objet connu par la catégorie)
         */
        protected $what; 
     
        /**
         * @ORM\Column(type="object")
         *
         * Ancienne valeur
         */
        protected $old; 
     
        /**
         * @ORM\Column(type="object")
         *
         * Nouvelle valeur
         */
        protected $new; 
     
        // ...
    }
    Cette table étant vide. Un dump de ces deux tables par phpMyAdmin, au cas où :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    -- --------------------------------------------------------
     
    --
    -- Table structure for table `log`
    --
     
    CREATE TABLE IF NOT EXISTS `log` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `category_id` int(11) DEFAULT NULL,
      `who_id` int(11) DEFAULT NULL,
      `what` int(11) NOT NULL,
      `old` longtext NOT NULL,
      `new` longtext NOT NULL,
      PRIMARY KEY (`id`),
      KEY `IDX_B7722E2512469DE2` (`category_id`),
      KEY `IDX_B7722E25F4E25B21` (`who_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
     
    --
    -- Dumping data for table `log`
    --
     
     
    -- --------------------------------------------------------
     
    --
    -- Table structure for table `logcategory`
    --
     
    CREATE TABLE IF NOT EXISTS `logcategory` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(255) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
     
    --
    -- Dumping data for table `logcategory`
    --
     
    INSERT INTO `logcategory` (`id`, `name`) VALUES
    (5, 'Édition de catégorie'),
    (6, 'Édition de quiz');
     
    -- --------------------------------------------------------
     
    --
    -- Constraints for table `log`
    --
    ALTER TABLE `log`
      ADD CONSTRAINT `log_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `logcategory` (`id`),
      ADD CONSTRAINT `log_ibfk_2` FOREIGN KEY (`who_id`) REFERENCES `user` (`id`);
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2008
    Messages : 186
    Par défaut
    Tiens, si jamais tu chercherais encore, voici une solution trouvée ici

    https://github.com/doctrine/data-fix...dd95482eeedf35

    En fait truncate marche pas encore super bien, alors le mieux c'est de revenir au dernier commit !

  7. #7
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 774
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 774
    Par défaut
    OK, , je vais essayer ça ASAP !
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Par défaut
    Je me suis mis aux fixtures, je rencontre la meme chose dourouc05
    Est-ce que tu as trouve une solution ? C'est un probleme purement MySQL j'ai l'impression, car je ne peux pas faire de truncate meme depuis phpmyadmin, mais je vois pas trop pourquoi.

    J'ai 2 tables, toutes les deux deja vides, je peux faire un truncate sur l'une mais pas sur l'autre... Je seche la.

  9. #9
    Membre confirmé
    Inscrit en
    Mars 2011
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 107
    Par défaut
    Enfaite il faut utiliser TRUNCATE CASCADE qui bien sur n'est pas sur la version de doctrine intégré dans le RC4 .
    Normalement il est intégré dans la prochaine version de doctrine...

  10. #10
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 774
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 774
    Par défaut
    Citation Envoyé par winzou Voir le message
    Est-ce que tu as trouve une solution ?
    Ma solution : j'ai abandonné les fixtures (elles n'étaient de toute façon pas des plus adaptées à ma situation, vu que je dois pouvoir relancer leur importation plus tard, étant donné qu'elles dépendent des données reçues d'autre part).
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Par défaut
    Les fixtures; c'est tout de même pour remplir avec des données pour que le projet fonctionne, non? Un peu comme une installation wordpress ou il crée des données démo pour démarrer.
    Je ne comprends pas pourquoi il faudrait ne pas tout vider.

  12. #12
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Par défaut
    Je verrais plus Fixtures comme des données à but de test et non pas comme données de production.

    Il serait plus viable lors d'une installation d’exécuter un fichier de type .sql pour remplir les tables en prod que d'utiliser les fixtures.

    Doc SF2 :
    Fixtures are used to load a controlled set of data into a database. This data can be used for testing or could be the initial data required for the application to run smoothly.

    Mais je reste tout de même partisan du fichier SQL pour l'initialisation en prod

  13. #13
    Membre averti
    Inscrit en
    Décembre 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 54
    Par défaut
    Pour compléter ce post, ce comportement dépend des versions de mysql. Sur un poste (je ne sais plus par coeur les numéros de version mais c'est la version packagée ubuntu), cela marche sans problème. Sur un autre poste avec une version légèrement plus récente, ce problème apparaît.

  14. #14
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Par défaut
    Je déterre un vieux truc mais comme le problème est toujours présent:

    une possible solution:
    - drop db
    - create db
    - create schema
    - load fixtures

    le truncate n'est alors pas nécessaire.

    A noter que pour les fixtures, j'ai fait un loader qui charge des fichiers yml du dossier resources/fixtures. Mes fichiers yml proviennent directement de phpmyadmin et fonctionne très bien. (fichier de villes par exemple)

Discussions similaires

  1. Merise : Contrainte d'intégrite fonctionnelle
    Par new_wave dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 22/06/2022, 11h51
  2. contrainte d'intégrité super dur a gérer !
    Par RockLee69 dans le forum Oracle
    Réponses: 3
    Dernier message: 30/11/2005, 15h02
  3. Réponses: 5
    Dernier message: 26/10/2005, 14h43
  4. [debutant] Contraintes d'intégrité définies sur un objet
    Par maysa dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/05/2004, 14h57
  5. Question sur les contraintes d'intégrités
    Par eGGyyS dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 27/04/2004, 13h51

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