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

QxOrm Discussion :

fetch_by_query_with_relation et sélection des champs


Sujet :

QxOrm

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut fetch_by_query_with_relation et sélection des champs
    Bonjour,

    J'ai deux tables reliés en one to many entre elles. Aucun problèmes la dessus. Cependant, elle sont toutes deux très lourdes en terme de quantités de donnée.

    Je veux recuperer pour une table tous les elements correspondant de la deuxieme table.

    Si j'utilise un fetch_by_query_with_relation, j'ai un temps d'acces de 1.7s alors que si je fais la meme requete a la main avec fetch_by_query mais en selectionnant seulement mes champs, je suis a 0.2s de temps de réponse.

    Je n'ai pas trouvé de surcharge me permettant de seulement recuperer les champs qui m’intéresse en mode 'relationnel'.

    Y a t'il une autre solution?

    (J'ai fais le test pour voir en désactivant mes champs inutiles pour cette requete, et je repasse a des temps d'acces de l'ordre de 0.2s)

    (Bien sur, j'ai redémarré mon serveur SQL pour esquiver les mises en caches)

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut


    En effet, quand tu utilises les fonctions "..._with_relation()", tu récupères automatiquement toutes les colonnes des tables. Désolé, il n'y a pas de possibilité pour le moment pour sélectionner les colonnes à fetcher en "mode relationnel". J'essayerai d'ajouter ça dans une prochaine version.

    Sinon, pour passer de 0.2s à 1.7s, tu dois effectivement avoir une grosse quantité de données (certainement des fichiers non ?) : est-ce que ça ne cache pas un problème de conception de tes tables ?
    En général, quand je dois stocker des documents en BDD, j'aime bien avoir une table dédiée pour ça, et je stocke uniquement un ID dans les tables qui sont liées à un document. Si ton schéma SQL n'est pas figé, tu peux peut-être réfléchir à ça...

    Il y a quand même une fonction de QxOrm que tu peux peut-être utiliser : qx:: dao::call_query(). Avec cette fonction, tu auras la possibilité de créer ta propre requête SQL, et ensuite tu devras parcourir le recordset pour alimenter ton instance de classe C++.
    Voici un extrait de la doc :
    qx::dao::call_query function can be used to call a custom SQL query or a stored procedure.

    To get an output value parameter (must be pass as QSql::Out or QSql::InOut) returned by a stored procedure, just call the following method : QVariant qx::QxSqlQuery::boundValue(const QString & sKey) const;.
    To iterate over all resultset, just use the following methods :

    long qx::QxSqlQuery::getSqlResultRowCount() const;
    long qx::QxSqlQuery::getSqlResultColumnCount() const;
    QVariant qx::QxSqlQuery::getSqlResultAt(long row, long column) const;
    QVariant qx::QxSqlQuery::getSqlResultAt(long row, const QString & column) const;
    QVector qx::QxSqlQuery::getSqlResultAllColumns() const;
    void qx::QxSqlQuery::dumpSqlResult();


    Here is an example of code using qx::dao::call_query function :

    qx_query query("CALL MyStoredProc(:param1, :param2)");
    query.bind(":param1", "myValue1");
    query.bind(":param2", 5024, QSql::InOut);
    QSqlError daoError = qx::dao::call_query(query);
    QVariant vNewValue = query.boundValue(":param2");
    query.dumpSqlResult();
    Autre possibilité : au niveau de ta BDD, tu crées une vue. Et dans ta vue, tu paramètres uniquement les champs que tu souhaites récupérer.
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup pour la réponse!

    Et oui, mes tables ont d'ailleurs plus d'un souci de conception (evol d'un prog de vingt ans d'âge...). Cependant, la modification des structures des tables est légèrement limitant car cela impose une régénération d'index de concordance qui risque de nous bloquer en prod pendant un petit moment, possible mais si je pouvais l'éviter...

    La solution de générer soit-même sa requête ne risque pas de légèrement casser la compatibilité multi-DB? Le but serait de ne pas faire comme l'ancien système ou on ne peut rien changer sans tout casser...

    Apres, je pense que c'est une solution plus pratique que de faire des vues. (Grosse volumétrie, je n'ai pas trop envie de pourrir ma bdd :/ )

    Mais c'est sur que je sauterais sur une evol du fetch_*_with_relation pour gerer les colonnes!

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut
    La solution de générer soit-même sa requête ne risque pas de légèrement casser la compatibilité multi-DB ?
    Non, si tu utilises qx:: dao::call_query() et que tu écris une requête SQL standard, tu n'as aucun soucis à te faire.

    Mais c'est sur que je sauterais sur une evol du fetch_*_with_relation pour gerer les colonnes!
    Désolé, je n'ai pas trop de temps à consacrer à la bibliothèque pour le moment, donc l'évolution risque de prendre un peu de temps.
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut
    Le fait de pouvoir sélectionner les colonnes associées aux relations est une nouvelle fonctionnalité de QxOrm 1.4.1.
    Pour le moment en phase BETA, tu peux tester cette nouvelle fonctionnalité, plus d'informations sur le sujet ici : http://www.developpez.net/forums/d15...eta-test-mode/

    Amélioration du moteur de relations : possibilité de sélectionner les colonnes à récupérer en utilisant la syntaxe suivante : my_relation { col_1, col_2, etc... }.
    Il y a un exemple dans le projet de test qxBlog montrant comment sélectionner les colonnes associées aux relations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // Fetch relations defining columns to fetch with syntax { col_1, col_2, etc... }
    list_blog lstBlogComplexRelation;
    daoError = qx::dao::fetch_all_with_relation(QStringList() << "{ blog_text }" << "author_id { name, birthdate }" << "list_comment { comment_text } -> blog_id -> *", lstBlogComplexRelation);
    qx::dump(lstBlogComplexRelation);
    qAssert(lstBlogComplexRelation.size() > 0);
    qAssert(lstBlogComplexRelation[0]->m_text != ""); // Fetched
    qAssert(lstBlogComplexRelation[0]->m_dt_creation.isNull()); // Not fetched
    qAssert(lstBlogComplexRelation[0]->m_author->m_sex == author::unknown); // Not fetched
    qAssert(lstBlogComplexRelation[0]->m_author->m_name != ""); // Fetched
    qAssert(lstBlogComplexRelation[0]->m_commentX.size() > 0);
    qAssert(lstBlogComplexRelation[0]->m_commentX[0]->m_dt_create.isNull()); // Not fetched
    qAssert(lstBlogComplexRelation[0]->m_commentX[0]->m_text != ""); // Fetched
    qAssert(lstBlogComplexRelation[0]->m_commentX[0]->m_blog);
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/07/2010, 15h50
  2. Sélection des champs à partir des requêtes
    Par rec82 dans le forum Bases de données
    Réponses: 4
    Dernier message: 09/12/2008, 19h49
  3. [GENIO 6.1.0] Sélection des champs à updater dans un smartinsert
    Par vincentbdv dans le forum OTIC (ex-Genio)
    Réponses: 1
    Dernier message: 09/04/2008, 16h46
  4. Sélection des champs d'une listbox
    Par Contractofoued dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 23/11/2007, 13h11
  5. sélection des champs à imprimer
    Par gueyou dans le forum Access
    Réponses: 3
    Dernier message: 18/09/2006, 16h58

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