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

ORM PHP Discussion :

[SQLite] Malformed database schema [Doctrine]


Sujet :

ORM PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    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 772
    Par défaut [SQLite] Malformed database schema


    Tout débutant avec ce framework, j'ai quelque difficulté à appréhender la partie base de données avec Doctrine... Ici, c'est un problème lors d'une requête en DQL. La voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $q = Doctrine_Query::create()
    ->select('u.id, u.username, u.jury, u.admin')
    ->from('Users u')
    ->where('u.id = ?', $id);
     
    $dbUsr = $q->execute();
    Où $id est l'id de l'utilisateur que je recherche dans la base.

    Vu qu'il me crache une erreur de schéma, il me semble utile de vous le fournir (juste l'extrait concerné) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Users:
        columns: 
         id: 
           type: integer
           primary: true
           notblank: true
           unique: true
           unsigned: true
         username:
           type: string(255)
           notblank: true
         jury: boolean
         admin: boolean
    Sauf que Symfony me ressort une belle erreur :

    SQLSTATE[HY000]: General error: 11 malformed database schema. Failing Query: "SELECT u.id AS u__id, u.username AS u__username, u.jury AS u__jury, u.admin AS u__admin FROM users u WHERE (u.id = ?)"
    Or, quand j'exécute la requête générée (demandée avec $q->getSqlQuery()), j'arrive à l'exécuter sans problème sur ma base de données SQLite... Je ne vois donc vraiment pas ce qui pourrait causer l'erreur.

    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
    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
    Pour le shema, je l'aurais écris ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    user:
      columns: 
        username:
          type: string(255)
          notblank: true
        jury: boolean
        admin: boolean
    Si aucune clef primaire n'est définie, doctrine génère automatiquement un champ id, integer (8), auto incrémenté et clef primaire, autant lui laisser faire le travail.

    De plus Users est devenu user. Pas de majuscule dans le shema, Doctrine en rajoute et cela risque de créer des confusions. De plus, par convention, les objet du modèle qui représente un enregistrement sont au singulier. Hors le nom de la table est aussi le nom de l'objet doctrine_record qui contiendra un enregistrement. D'où le singulier. On utilisera le "s" dans les relations, du côté n d'une relation pour indiquer que le retour est une collection d'enregistrements (doctrine_querry).

    Mais ceci ne donne pas la solution à ton problème.

    Dans le query, à partir du moment où tu récupère tous les champs, il n'est pas nécessaire de mettre la méthode select.

    Mais ceci non plus ne va pas donner la solution.

    En fait, je réessayerai avec le schémas modifié, la requête modifiée en fonction et sans la close select.

    A priori, avec un base mysql, j'aurais procédé comme toi, avec un sqlite, il ne devrait pas y avoir de différence.

    Je pense que le problème vient de l'hydratation, et non pas du SQL et que le message serait 'une fausse barbe", mais sans aucune certitude.

  3. #3
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    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 772
    Par défaut
    Après avoir modifié comme tu l'as dit, ça ne change pas grand chose... Si ce n'est à mes connaissances de Doctrine.

    Schéma mis à jour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    user: 
      package: defis
      columns: 
        username:
          type: string(255)
          notblank: true
        jury: boolean
        admin: boolean
    Ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $q = Doctrine_Query::create()
        ->from('user u')
        ->where('u.id = ?', $id);
    Et le même message :

    SQLSTATE[HY000]: General error: 11 malformed database schema. Failing Query: "SELECT u.id AS u__id, u.username AS u__username, u.jury AS u__jury, u.admin AS u__admin FROM user u WHERE (u.id = ?)"
    N'y aurait-il pas d'autres méthodes ? Genre charger toute la table et sélectionner ce que l'on veut ? (Bon, d'accord, c'est pas top niveau perfs, vu qu'à chaque fois on se tape toute une table mais si ça fonctionne...).
    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
    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
    Je ne vois pas d'où vient l'erreur.

    J'ai monté une application test pour ... tester !

    Premier test en mysql.

    Le schéma utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    user:
      columns:
        username:
          type: string(255)
          notblank: true
        jury: boolean
        admin: boolean
    J'ai supprimé la notion de package, sans intérêt ici.

    J'ai rajouté un fixture, pour "avoir du grain à moudre"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    user:
      u01:
        username: userN1
        jury: true
        admin: false
      u02:
        username: userN2
        jury: false
        admin: true
    Généré la base
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    symfony doctrine:build --all --and-load
    Génération OK et les données sont dans la base.

    Puis j'ai créé un module "generate:module frontend test"
    Et dans l'action index,
    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
     
    class testActions extends sfActions
    {
     
        /**
         * Executes index action
         *
         * @param sfRequest $request A request object
         */
        public function executeIndex( sfWebRequest $request )
        {
            $q = Doctrine_Query::create()
                            ->from( 'user u' )
                            ->where( 'u.id = ?', 2 );
            $this->qr = $q->execute();
         }
    et un template, pour faire beau
    L'exécution de test/index passe et je retrouve bien l'exécution de la requête dans la barre de débug.


    Bon, une fois testé avec mysql, je me lance dans le sqlite.

    Modification du database.yml pour lui donner les paramètres pour la base sqlite et, grande première, je me refait l'action du buid (après avoir supprimé manuellement les dossiers filter, form et modèle). Le build et le fixature passent (ça y est, je sais travailler avec sqlite )

    Et la page s'affiche aussi, sans aucun message d'erreur.

    Bon, ça n'aide pas entièrement, mais cela prouve que ton code est viable et que le problème ne vient ni de symfony (doctrine) (1.4), ni d'apache 2.2.11, ni de PHP 5.3.0.

    Il reste à chercher ailleurs, le drivers php pour sqlite ? Une base sqlite corrompue ?

    Le problème c'est qu'une recherche sur "SQLSTATE[HY000]: General error: 11 malformed database schema." avec notre ami google ne donne que deux réponse, dont le présent sujet () et un autre qui n'a rien de bien convainquant.

    Essaye de virer ton fichier db et de le recréer. Essaye de réinstaller PHP. Je suis un peu à cour d'options et d'idées.

  5. #5
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    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 772
    Par défaut
    Je viens d'essayer un test très barbare d'attaque sur la base de données :*

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    $pdo = new PDO('sqlite:.../sqlite.db');
    $req = $pdo->query('SELECT u.id AS u__id, u.username AS u__username, u.jury AS u__jury, u.admin AS u__admin FROM user u WHERE (u.id = 254882) LIMIT 1');*
    En faisant des var_dump sur $pdo et $req, j'obtiens :*

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    object(PDO)#1 (0) {
    }
    bool(false)
    Ce qui est sans équivoque... Je ne peux pas réinstaller PHP, PDO, PDO_SQLite ou autre chose sur le serveur, je vais donc voir ce qu'il est possible de faire d'autre... Un SGBD fichier codé bourrinement ?*

    pour ton aide mais tu n'y pouvais rien... Bon, à passer en Délestage...
    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
    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
    Ça me confirme dans mon choix de MySql.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Lazarus] SQL - Erreur "database schema has changed"
    Par OR34a dans le forum Lazarus
    Réponses: 8
    Dernier message: 04/03/2015, 18h38
  2. [SQLite] Erreur "database disk is malformed"
    Par eric-m dans le forum Android
    Réponses: 2
    Dernier message: 09/11/2011, 21h35
  3. Exceptions, sqlite database locked
    Par r470n dans le forum Général Python
    Réponses: 4
    Dernier message: 01/09/2009, 15h35
  4. probleme pour recuperer le schema d'une base sqlite
    Par ojouny dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 20/04/2009, 12h03
  5. CREATE SCHEMA ou DATABASE
    Par Breizhim dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/02/2009, 16h23

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