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 :

QUuid comme primary key ?


Sujet :

QxOrm

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations forums :
    Inscription : Août 2011
    Messages : 26
    Par défaut QUuid comme primary key ?
    Bonjour,

    Mes bases postgresql utilisent des primary key de type uuid.

    Je souhaite donc utiliser QUuid comme type primary key avec QxOrm.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QX_REGISTER_PRIMARY_KEY(domain::testtable, QUuid )
    provoque une erreur à la compilation :

    ..\..\boost_1_47_0/boost/serialization/access.hpp:118: error: 'struct QUuid' has no member named 'serialize'

    Une idée ?

  2. #2
    Membre Expert

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 482
    Par défaut
    Je souhaite utiliser QUuid comme type primary key avec QxOrm.
    Il est nécessaire de spécialiser un certain nombre de template avant de pouvoir utiliser une classe comme primary key.

    Concernant les classes Qt, tu trouveras la liste des classes supportées (pour la serialization notamment) dans le dossier ./include/QxSerialize/Qt/.

    La classe QUuid n'est pas encore supportée par la bibliothèque QxOrm.
    Je l'intègre dans la version 1.1.8 qui sort bientôt...

    PS: voici un moyen de contournement en attendant la version 1.1.8 :
    1- tu déclares ta propriété (qui correspond à la primary key) en QString
    2- tu crées des accesseurs en utilisant QUuid (comme ça, vu de l'extérieur de ta classe, tu travailles avec des QUuid, et la conversion QUuid <-> QString est très simple à mettre en place)
    3- il faut penser à écrire : QX_REGISTER_PRIMARY_KEY(domain::testtable, QString)
    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
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations forums :
    Inscription : Août 2011
    Messages : 26
    Par défaut
    Merci, c'est ce que j'ai fait pour contourner...

    Cependant, QUuid::tostring() return un QString sous la forme : "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}" alors que postgres attends 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' je ne connais pas le format attendu par les autres bases.

    J'aurai besoin aussi de persister bien d'autres types, notamment tous les types "geometry" de boost (à partir de boost 1.47.0). Est-il possible de définir ses propres templates et de les enregistrer avec une macro du style QX_REGISTER_DATATYPE ? Cela permettrait de sérialiser et de persister n'importe quel type d'objet.

    Merci de ton aide.

  4. #4
    Membre Expert

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 482
    Par défaut
    Cependant, QUuid::tostring() return un QString sous la forme : "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}" alors que postgres attends 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' je ne connais pas le format attendu par les autres bases.
    Je ne sais pas non plus. Personnellement, pour les clés primaires, j'utilise soit un nombre (long), soit une chaine de caractères (QString), je n'utilise jamais d'autres types. Dans ton cas, tu peux toujours t'en sortir en faisant la conversion (enlever ou ajouter les accolades) dans tes accesseurs get/set.

    J'aurai besoin aussi de persister bien d'autres types, notamment tous les types "geometry" de boost (à partir de boost 1.47.0). Est-il possible de définir ses propres templates et de les enregistrer avec une macro du style QX_REGISTER_DATATYPE ? Cela permettrait de sérialiser et de persister n'importe quel type d'objet.
    Oui c'est possible, tu peux faire persister n'importe quel type, même s'il n'a pas été défini dans le contexte QxOrm (par la fonction qx::register_class).
    Il faut simplement que tu écrives les fonctions de serialization attendu par boost. Voici un tuto pour t'aider (il y en a plein d'autres sur le net) :
    http://khayyam.developpez.com/articl...serialization/
    Ce qui t'intéresse dans ton cas, c'est la méthode non intrusive (puisque tu n'as pas écris les classes).

    Remarque : certaines classes de la bibliothèque boost propose déjà les méthodes de serialization, donc c'est à vérifier avant de commencer à coder...

    Une fois tes méthodes de serialization écrites, définit les colonnes de ta table au format texte (VARCHAR par exemple) => tes objets seront enregistrés en base au format XML automatiquement.

    Si ce n'est pas assez clair ou que tu veux un exemple, dis-le moi...
    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
    Membre Expert

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 482
    Par défaut
    Pour info, la version 1.1.8 est sortie : le type QUuid peut être utilisé comme clé primaire.

    Une fois tes méthodes de serialization écrites, définit les colonnes de ta table au format texte (VARCHAR par exemple) => tes objets seront enregistrés en base au format XML automatiquement.
    Une petite précision sur ce que j'ai écris : la serialization XML pour enregistrer en BDD est le comportement par défaut pour toutes classes non enregistrées dans le contexte QxOrm. C'est utile par exemple si tu veux enregistrer une collection d'objets sans vouloir faire de relations (et donc gérer une autre table dans la BDD) => par exemple, si tu déclares une propriété du type std::vector<mon_objet> dans une classe persistante et qu'il n'y a pas de relation associée, ta liste sera enregistrée en BDD au format XML.

    Tu peux également modifier ce comportement par défaut pour un type en particulier (c'est la magie des template en C++). Le module QtSql de Qt utilise la classe QVariant pour envoyer/recevoir des données de la BDD. Tu peux donc convertir comme tu veux ton type (un QVariant peut par exemple contenir un format binaire en utilisant QByteArray). Il suffit de spécialiser les templates suivants :

    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
    namespace qx {
    namespace cvt {
    namespace detail {
     
    template <> struct QxStringCvt_ToVariant< MaClasse > {
    static inline QVariant toVariant(const MaClasse & t, const QString & format, int index)
    { /* Ici je convertis MaClasse en QVariant */ } };
     
    template <> struct QxStringCvt_FromVariant< MaClasse > {
    static inline qx_bool fromVariant(const QVariant & v, MaClasse & t, const QString & format, int index)
    { /* Ici je convertis QVariant en MaClasse */; return qx_bool(true); } };
     
    } // namespace detail
    } // namespace cvt
    } // namespace qx
    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.

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations forums :
    Inscription : Août 2011
    Messages : 26
    Par défaut
    Merci pour ces précisions.

    QUuid fonctionne bien en primary key.

    Grace à ton aide, j'arrive sans problème à persister mes classes d'objets géométriques dans la BDD, mais j'ai un problème avec des classes templates :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    template
    <typename MonType>
    class MaClasseTemplate: ObjectHerite<MonType>
    Je ne trouve pas la bonne structure pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    template <> struct QxStringCvt_ToVariant< MaClasseTemplate> {
    static inline QVariant toVariant(const MaClasseTemplate& t, const QString & format, int index)
    { ...... } };
    Le compilateur me renvoie :
    ..\QxOrm\include/QxCommon/QxStringCvt_Impl.h:230: instantiated from 'static QString qx::cvt::detail::QxStringCvt_ToString<T>::toString(const T&, const QString&, int) [with T = MaClasseTemplate<double>]'
    Ca fait 2 heures que je bloque sur la définition de QxStringCvt_ToString...

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

Discussions similaires

  1. [ODBC] Recherche du champ qui est Primary Key
    Par XtofRoland dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 07/02/2006, 11h43
  2. PRIMARY KEY - UNIQUE - INDEX
    Par Thierry8 dans le forum Requêtes
    Réponses: 4
    Dernier message: 16/12/2005, 23h28
  3. pb de primary key sur 2 colonnes
    Par new_wave dans le forum Designer
    Réponses: 14
    Dernier message: 25/11/2005, 11h05
  4. DROP PRIMARY KEY
    Par popopopo dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/08/2005, 11h11
  5. BDD, r-a-z index et indice primary key ?
    Par lord_paco dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 11/07/2003, 10h24

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