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

PyQt Python Discussion :

Liaison entre base mysql et QSqlRelationalTableModel


Sujet :

PyQt Python

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 8
    Par défaut Liaison entre base mysql et QSqlRelationalTableModel
    Bonjour,
    J'ai cherché un peu partout mais je ne trouve pas.
    j'ai une base d'essai que je voudrais afficher dans un TableVeiw mais je n'arrive pas à créer la liaison de la base avec le QsqlRelationalTableModel
    j'ai le message d'erreur :
    error QSqlRelationalTableModel(parent.....): argument 2 has unexpected 'CMySQLConnexion'
    j'ai essayé avec la fonction MySQLConnexion de mysql.connector mais j'obtiens le même message avec
    MySQLConnexion au lieu de CMySQLConnexion.
    avec une connexion a une base SQLite ça fonctionne.
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
     
    # -*- coding: utf-8 -*-
    """
    Created on Thu Jan 10 18:01:19 2019
    etude_bdd_treview2.py
    @author: gpoid
    """
     
    import sys
    from PyQt5 import (QtWidgets, QtCore, QtSql)
    import mysql.connector
    from mysql.connector import errorcode
     
    DB_NAME = 'etude'
    table = "matable"
     
    #####################################################################
    def ouvrebase(basesql):
        """ouvre la base et renvoie la connexion
           si contrainte est True, active les contraintes de clé étrangère
           en cas d'échec, retourne None"""
     
        try:
           cnx = mysql.connector.connect(host = '127.0.0.1',
                                database = DB_NAME,
                                user = 'guy',
                                password = ' ')
           if cnx.is_connected():
                print('Connecté MySql à la base')
                return cnx
     
        except mysql.connector.Error as err :
           if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
               print("erreur nom utilisateur ,ou password")
           elif err.errno == errorcode.ER_BAD_DB_ERROR:
                print("la base n existe pas")
           sys.exit()
     
     
     
     
    #######################################################################
     
    class VoirTableSql(QtWidgets.QMainWindow):
        def __init__(self, basesql, nomtable, parent=None):
            super().__init__(parent)
            self.setWindowTitle("Affichage de la table %s" % (nomtable,))
            self.resize(800, 600)
            # ouvre la baseb SQL
            self.basesql=DB_NAME
            self.cnx=ouvrebase(basesql)
     
     
            # table à afficher
            self.nomtable = nomtable
            # crée le modèle et sa liaison avec la base SQL ouverte
            self.model = QtSql.QSqlRelationalTableModel(self,self.cnx )
            # stratégie en cas de modification de données par l'utilisateur
            self.model.setEditStrategy(QtSql.QSqlRelationalTableModel
                                       .OnManualSubmit)
            # crée la table graphique et son lien avec le modèle
            self.vuetable = QtWidgets.QTableView(self)
            self.vuetable.setModel(self.model)
            # active le tri en cliquant sur les têtes de colonnes
            #self.vuetable.setSortingEnabled(True)
            # crée un bouton pour enregistrer les modifications dans la base
            self.bouton1 = QtWidgets.QPushButton(
                    "Enregistrer les modifications", self)
            self.bouton1.clicked.connect(self.appliquer)
            # crée un bouton pour annuler les modifications non enregistrées
            self.bouton2 = QtWidgets.QPushButton("Annuler les modifications",
                                                 self)
            self.bouton2.clicked.connect(self.annuler)
            # positionne les widgets dans la fenêtre QMainWindow
            self.setCentralWidget(QtWidgets.QFrame())
            posit = QtWidgets.QGridLayout()
            posit.addWidget(self.bouton1, 0, 0)
            posit.addWidget(self.bouton2, 0, 1)
            posit.addWidget(self.vuetable, 1, 0, 1, 2)
            self.centralWidget().setLayout(posit)
            # affiche la table demandée
            self.model.setTable(self.nomtable)
            self.model.select() # peuple le modèle avec les données de la table
            # met un delegate standard pour l'édition
            self.vuetable.setItemDelegate(QtSql.QSqlRelationalDelegate(
                    self.vuetable))
            # trie si nécessaire selon la colonne 0
            self.model.sort(0, QtCore.Qt.AscendingOrder) # ou DescendingOrder
            # ajuste hauteur lignes et largeur colonnes selon contenus
            self.vuetable.resizeColumnsToContents()
            self.vuetable.resizeRowsToContents()
     
        #===================================================================
        def appliquer(self):
            """Enregistre les modifications des données
    * * * * """
            if self.model.submitAll():
                # ajuste hauteur lignes et largeur colonnes selon contenus
                self.vuetable.resizeColumnsToContents()
                self.vuetable.resizeRowsToContents()
                # message ok
                QtWidgets.QMessageBox.information(self,
                    "Enregistrement des modifications",
                    "Enregistrement terminé")
            else:
                # message erreur
                QtWidgets.QMessageBox.warning(self,
                    "Enregistrement des modifications",
                    "Erreur: %s" % self.model.lastError().text())
        #===================================================================
        def annuler(self):
            """Annule les modifications des données faites avant enregistrement """
            self.model.revertAll()
        #===================================================================
        def closeEvent(self, event=None):
            """Méthode appelée automatiquement à la fermeture de la fenêtre
    * * * * """
            # ferme la base 
            event.accept()
     
    ########################################################################
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        fen = VoirTableSql(DB_NAME, table)
        fen.show()
        sys.exit(app.exec_())
    De l'aide serait la bienvenue.

  2. #2
    Membre chevronné
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Mai 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 290
    Par défaut
    Bonjour,
    error QSqlRelationalTableModel(parent.....): argument 2 has unexpected 'CMySQLConnexion'
    QSqlRelationalTableModel attend une QSqlDatabase.
    Tu devrais passer par le driver MYSQL de PyQt plutôt que mysql.connector.

Discussions similaires

  1. liaison entre bases de données paradox de 2 tables avec (X.N) (X.N)
    Par saidihno dans le forum Bases de données
    Réponses: 1
    Dernier message: 01/06/2010, 22h57
  2. Réplications entre bases mysql
    Par bast292 dans le forum MySQL
    Réponses: 4
    Dernier message: 01/04/2010, 13h48
  3. Synchronisation entre bases MySQL et SQLite
    Par liavart dans le forum MySQL
    Réponses: 0
    Dernier message: 29/07/2009, 13h19
  4. MàJ entre bases Mysql
    Par beston dans le forum MySQL
    Réponses: 2
    Dernier message: 05/03/2009, 17h53
  5. Réponses: 5
    Dernier message: 07/06/2006, 14h24

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