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 Discussion :

De la meilleure façon d'appréhender les vues SQL dans Qt


Sujet :

Bases de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 6
    Par défaut De la meilleure façon d'appréhender les vues SQL dans Qt
    Bonjour,

    C'est mon premier message ici et il est peut-être un peu hors sujet (si vous trouvez que c'est le cas, je m'en excuse par avance), mais j'aimerais quand même avoir l'avis d'experts Qt sur la question.

    Voilà : d'un côté j'ai une base PostgreSQL avec une table et une vue (au sens SQL, c'est à dire créée par CREATE VIEW...) basée sur cette table, et d'un autre côté j'ai une appli écrite en QtJambi (le problème serait le même en C++) qui va utiliser cette base.

    Le framework Model/View de Qt permet de définir une QTableModel qui constitue un modèle (au sens MVC) correspondant à une table SQL. A l'utilisation, on modifie les données dans cette QTableModel puis on fait un database().commit() pour répercuter les modifs dans la base SQL. Très pratique.

    Du point de vue de Qt, les vues PostgreSQL ne présentent aucune différence avec les tables. On peut donc utiliser une vue SQL comme source de données d'une QTableModel. Pas de problème... en tout cas tant qu'on essaie pas de modifier les données car les vues PostgreSQL sont read-only. Je n'ai pas osé essayer un commit() sur une vue, je suis à peu près sûr du résultat.

    Pour pouvoir éditer les données la démarche logique est donc d'utiliser la table SQL comme source de données et non plus la vue (1). Mais alors pour présenter les données comme dans la vue il faut réécrire dans le code, l'équivalent de toutes les fonctions PostgreSQL utilisées dans la vue, et comme j'ai passé pas mal de temps à développer toutes ces fonctions pour construire cette vue (assez complexe, en fait), j'aimerais bien éviter d'avoir à me retaper tout le boulot dans le code. D'autant que les premiers tests font apparaitre une chute de perf assez considérable.

    Est-ce que vous auriez des idées sur la meilleure façon d'appréhender la question ?

    Merci pour toute information à ce sujet.

    jMax

    (1) Parler de vue comme source de données d'un modèle paraitra certainement très bizarre aux spécialistes du MVC, mis ne perdons pas de... vue (justement ) qu'il s'agit là de vues SQL, c'est à dire de conteneurs de données.

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Bonjour et bien venue sur le forum.
    Je n'ai pas tout compris a ton problème...
    Mais on ne sait jamais, as tu regardé ces class??
    http://qt.developpez.com/doc/4.3/qsq...model/#details
    http://qt.developpez.com/doc/4.3/qsq...model/#details

  3. #3
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Salut,

    Tu devrais tenter en surchargeant les méthodes protégées QSqlTableModel::updateRowInTable, QSqlTableModel::insertRowIntoTable et QSqlTableModel::deleteRowFromTable pour modifier les sources réelles.
    Par contre, c'est à toi de mapper les indices de lignes sur l'enregistrement source, ainsi que d'extraire les parties correspondantes de QSqlRecord pour les utiliser à l'entroit mappé précedemment.

    (A noter que je ne jamais testé, mais que c'est par là que je commencerais si j'étais dans ton cas).

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 6
    Par défaut
    Bonjour !

    L'idée de surcharger les méthodes adéquates dans QSqlTableModel me parait tout à fait intéressante. Le plus propre serait peut-être de le faire avec un proxyModel customisé (héritant directement de QAbstractProxyModel) en réimplémentant les fonctions de mapping et d'index.

    Bon, je vais faire des protos pour voir ce que ça donne ne terme de perfs et je crois que je déciderai à partir de là...

    En tout cas merci pour cette très bonne idée.

    Cordialement

    jMax

  5. #5
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Je ne suis pas sûr que ce genre de manip soit à déléguer dans un proxy. Après tout, ça reste le modèle original qui fait la gestion du lien données DB <-> applis.

    Je suis curieux de connaître le résultat de tes investigations, ça peut toujours être utile

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/08/2012, 09h25
  2. Réponses: 2
    Dernier message: 25/05/2011, 17h02
  3. [PHP 5.3] Meilleure façon de traiter les données transmises par formulaire
    Par AsKaiser dans le forum Langage
    Réponses: 2
    Dernier message: 06/02/2011, 22h00
  4. Réponses: 13
    Dernier message: 07/01/2009, 11h04
  5. Réponses: 1
    Dernier message: 30/01/2008, 10h54

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