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 :

Conversion à PostgreSQL


Sujet :

Doctrine2 PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 23
    Par défaut Conversion à PostgreSQL
    Bonsoir,

    Je vous écris car j'ai des problèmes avec l'utilisation de Doctrine poru convertir ma base de données PostgreSQL en un schema XML ou YAML.

    En effet, j'ai suivi les indications données sur cette page : http://symfony.com/doc/2.0/cookbook/...gineering.html

    Mais lorsque je tape la commande suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    php app/console doctrine:mapping:convert xml ./src/CatalogueMO/InputBundle/Resources/config/doctrine/metadata/orm --from-database --force
    J'obtiens l'exception PDO suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      [PDOException]                                                                                                    
      SQLSTATE[21000]: Cardinality violation: 7 ERROR:  more than one row returned by a subquery used as an expression  
     
     
     
    doctrine:mapping:convert [--filter="..."] [--force] [--from-database] [--extend[="..."]] [--num-spaces[="..."]] [--em[="..."]] to-type dest-path

    J'ai eu beau chercher un peu partout pour comprendre mon erreur, je ne m'en sors pas...
    Je ne sais plus vraiment quoi faire... J'ai essayer cette même commande sur une base de données très simple et elle a fonctionné. J'imagine donc que le problème vient de ma base de données mais elle est très complexe... (Une 50 aine de table)

    J'ai essayé de supprimer les triggers mis ça n'a rien donné...

    En esperant que vous pourrez m'aider.

    Cordialement,
    Birmania

  2. #2
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Aucune idée...

    Il semblerait que la récupération depuis PostgreSQL passe par une requête (un peu comme pour MySql) et que lors de cette requête Doctrine rencontre une erreur (celle que tu donnes). Pourquoi et où demeure un mystère.

    Quant à trouver la requête qui plante... bonne chance.

    Regarde dans les liaisons entre les tables si tu n'aurais pas, quelque part, une liaisons d'un champ d'une table vers deux champs de l'autre...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 23
    Par défaut
    Je te remercie déjà pour cette réponse ! (Je me sens un peu moins perdu...)

    Je viens de supprimer bloc par bloc des parties de la base de données pour repérer l'endroit qui pose problème et je viens de le trouver.

    Seulement je ne comprend pas vraiment pourquoi il bloque sur cet endroit assez simple (surtout qu'une "copie conforme" de cette architecture est juste à côté et ça ne lui pose pas de problème...)

    Voici le modèle physique de données de l'architecture :


    On peux voir que la branche gauche est identique en architecture à celle de droite mais c'est celle de droite qui lance l'erreur. Si on supprime la branche de droite, ça va mieux (Une autre erreur apparait par contre...)

    Cette deuxième erreur qui apparait est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [InvalidArgumentException]                                                                                                          
      ManyToMany table 'products' with more or less than two foreign keys are not supported by the Database Reverese Engineering Driver.
    J'ai entendu dire qu'effectivement Doctrine V2 ne gére par les triples clés étrangères mais il semblerait qu'ils aient travaillé sur ce point pour Doctrine V2.1 (la béta).

    Donc première question :
    Auriez vous une solution pour mon premier problème (la branche de droite incorrecte).

    Deuxième question :
    Sauriez vous si Doctrine V2.1 gère bien les triples clés étrangères ?

    Merci pour tout !

  4. #4
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    J'ai déplacé dans la salle symfony2 où nous allons avoir plus de chance de trouver des connaisseurs sur doctrine 2.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 23
    Par défaut
    Ah... Je suis sincèrement désolé je ne savais pas qu'il y avait deux sections de forum différentes pour les deux versions de Doctrine...

    Pour ce qui est de la branche droite qui pose problème, je pourrais contourner le problème puisque la branche gauche (disposant de la même architecture) peut apparement être générée. Je pourrais donc m'inspirer du code généré pour créer celui de la branche de droite à la main.

    Le plus gros problème à l'heure actuelle est donc celui des triples clés étrangères...
    J'ai voulu essayer d'installer Doctrine 2.1 (béta) pour voir si cette nouvelle version peut les gérer mais je n'ai pas trouvé comment l'installer...

    J'ai télécharger le packages à l'aide du lien sur ce site :
    http://www.doctrine-project.org/projects/orm/download

    Seulement je ne vois pas vraiment quoi faire avec... (J'ai cependant pu remarquer des similitudes entre le contenu des dossier qu'il contient et le contenu du dossier "Vendor". Faut-il écraser les dossier contenu dans "Vendor" par les nouveaux ?)

    Merci pour votre aide !

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    195
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 195
    Par défaut
    Le problème que tu as si j'ai bien compris c'est que tu n'arrive pas a générer la class d'une table avec une clé étrangère faites de trois éléments, le message d'erreur est assez explicite et signifie pas que doctrine ne gère pas les clés triple mais plutôt qui ne sait pas générer les class. La seule solution que je vois c'est de le faire à la main.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 23
    Par défaut
    D'accord je vois, merci beaucoup alors ! Je vais voir si en m'inspirant des classes qui peuvent être générés je peux réussir à écrire la classe concernant cette partie de la base de données.

    J'ai donc supprimer :
    1. La branche "Parameters" posant problème
    2. Les "blocs" de la base de données où se trouvent des clés étrangères composées de trois élèments

    Essayons de nouveau la commande... Ah, une nouvelle exception.

    La voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      [Doctrine\ORM\Mapping\MappingException]                                                     
      Property "idvariable" in "Contain" was already declared, but it must be declared only once
    Mhhh mhhh... Très étrange...
    En cherchant sur le net pour voir si quelqu'un d'autre était tombé sur ce problème j'ai trouvé ce topic :
    http://groups.google.com/group/doctr...6b0e633f56cbe6

    On peut voir que la personne qui a eu ce problème a reporté l'erreur aux développeurs de Doctrine sur ce billet :
    http://www.doctrine-project.org/jira/browse/DDC-627

    Les développeurs indiquent que cette erreur est censée être corrigée dans la version Doctrine 2.0 BETA3.

    En regardant dans le fichier vendor/doctrine/LICENSE, j'ai pu voir que j'étais à la doctrine V2.1. Ils ne répercutent donc les corrections que sur certaines versions de Doctrine et non les supérieurs ?
    Si oui, il faudrait que j'installe la version antérieure 2 Beta 3 pour pouvoir générer mon schéma donc ?

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    195
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 195
    Par défaut
    Normalement ton bug est corrigé à mon avis

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 23
    Par défaut
    J'ai essayé de répértorier l'ensemble des tables qui me lance cette exception et de trouver un point commun entre elles.

    Apparement, les tables qui posent problèment sont celles disposant d'une clé primaire composée de trois (ou plus) clés étrangères et les tables qui disposent d'une clé primaire composée de deux clés étrangères et qui possèdent également une clé étrangère simple à côté.

    Donc :
    Les tables disposant d'une clé primaire non composée et de clés étrangères en parallèle ou celles disposant d'une clé primaire composé de deux clés étrangères exactement et qui n'ont pas de clés étrangères en parallèle sont les seules à être générées.

    Si vous avez une idée, n'hésitez surtout pas ! Et merci encore !

Discussions similaires

  1. conversion postgresql to mysql
    Par dirkolivier dans le forum Requêtes
    Réponses: 1
    Dernier message: 23/08/2010, 09h17
  2. Réponses: 7
    Dernier message: 24/08/2006, 08h28
  3. Réponses: 2
    Dernier message: 01/08/2006, 16h55
  4. conversion mysql vers postgresql
    Par backus dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 04/07/2005, 18h42
  5. logiciel conversion access postgresql ?
    Par donny dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 22/05/2005, 10h44

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