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

Python Discussion :

Sqlite et glade


Sujet :

Python

  1. #1
    Membre confirmé Avatar de figarojuju
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Par défaut Sqlite et glade
    Bonjour,
    j'aimerais faire une petite application qui enregistre des données dans une base sqlite via une interface graphique.
    Dès que je lance mon programme, j'initialise mes données et je souhaite que
    SI la table examen n'est pas créée ALORS le programme l'écrit dans la base lombaire
    SINON on passe à la suite...

    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
     
    import pygtk
    pygtk.require("2.0")
    import gtk
    import gtk.glade
     
    import sqlite3
     
     
    class lombaire:
        def __init__(self):
            self.widgets = gtk.glade.XML('lombaire.glade',"window1")
            events = {'on_reg_clicked':self.enregistrer,'on_window1_delete_event':self.delete}
            self.widgets.signal_autoconnect(events)
            self.conn=sqlite3.connect('lombaire')
            self.cur=self.conn.cursor()
            try:
                self.cur.execute('CREATE TABLE examen (nom VARCHAR(50))')
            except IOError:
                print 'table déjà créée'
     
        def delete(self,source=None,event=None):
            gtk.main_quit()
     
        def enregistrer(self,source=None,event=None):
            '''self.truc=self.widgets.get_widget('entry1').get_text()
            print self.truc
            self.cur.execute("insert into examen (nom) values (?) ",self.truc)
            self.conn.commit()'''
            pass
     
    if __name__ == '__main__':
        app=lombaire()
        gtk.main()
    Voici le message d'erreur qui m'est renvoyé
    Traceback (most recent call last):
    File "lombaire.py", line 32, in <module>
    app=lombaire()
    File "lombaire.py", line 17, in __init__
    self.cur.execute('CREATE TABLE examen (nom VARCHAR(50))')
    sqlite3.OperationalError: table examen already exists
    Mon fichier glade :
    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
     
    <?xml version="1.0"?>
    <glade-interface>
      <!-- interface-requires gtk+ 2.16 -->
      <!-- interface-naming-policy project-wide -->
      <widget class="GtkWindow" id="window1">
        <property name="height_request">150</property>
        <property name="visible">True</property>
        <signal name="delete_event" handler="on_window1_delete_event"/>
        <child>
          <widget class="GtkVPaned" id="vpaned1">
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <child>
              <widget class="GtkHButtonBox" id="hbuttonbox1">
                <property name="visible">True</property>
                <child>
                  <widget class="GtkButton" id="reg">
                    <property name="label" translatable="yes">enregistrer</property>
                    <property name="visible">True</property>
                    <property name="can_focus">True</property>
                    <property name="receives_default">True</property>
                    <signal name="clicked" handler="on_reg_clicked"/>
                  </widget>
                  <packing>
                    <property name="expand">False</property>
                    <property name="fill">False</property>
                    <property name="position">0</property>
                  </packing>
                </child>
                <child>
                  <widget class="GtkButton" id="button2">
                    <property name="label" translatable="yes">button</property>
                    <property name="visible">True</property>
                    <property name="can_focus">True</property>
                    <property name="receives_default">True</property>
                  </widget>
                  <packing>
                    <property name="expand">False</property>
                    <property name="fill">False</property>
                    <property name="position">1</property>
                  </packing>
                </child>
                <child>
                  <widget class="GtkButton" id="button3">
                    <property name="label" translatable="yes">button</property>
                    <property name="visible">True</property>
                    <property name="can_focus">True</property>
                    <property name="receives_default">True</property>
                  </widget>
                  <packing>
                    <property name="expand">False</property>
                    <property name="fill">False</property>
                    <property name="position">2</property>
                  </packing>
                </child>
              </widget>
              <packing>
                <property name="resize">False</property>
                <property name="shrink">True</property>
              </packing>
            </child>
            <child>
              <widget class="GtkLayout" id="layout1">
                <property name="visible">True</property>
                <child>
                  <widget class="GtkLabel" id="nom">
                    <property name="width_request">100</property>
                    <property name="height_request">80</property>
                    <property name="visible">True</property>
                    <property name="label" translatable="yes">Nom</property>
                  </widget>
                  <packing>
                    <property name="x">17</property>
                    <property name="y">42</property>
                  </packing>
                </child>
                <child>
                  <widget class="GtkEntry" id="entry1">
                    <property name="width_request">100</property>
                    <property name="height_request">30</property>
                    <property name="visible">True</property>
                    <property name="can_focus">True</property>
                    <property name="invisible_char">&#x25CF;</property>
                  </widget>
                  <packing>
                    <property name="x">100</property>
                    <property name="y">60</property>
                  </packing>
                </child>
              </widget>
              <packing>
                <property name="resize">True</property>
                <property name="shrink">True</property>
              </packing>
            </child>
          </widget>
        </child>
      </widget>
    </glade-interface>

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Par défaut
    Salut,
    ça me paraît clair :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Traceback (most recent call last):
    File "lombaire.py", line 32, in <module>
    app=lombaire()
    File "lombaire.py", line 17, in __init__
    self.cur.execute('CREATE TABLE examen (nom VARCHAR(50))')
    sqlite3.OperationalError: table examen already exists
    La table existe déjà, et l'exception n'est pas interceptée car c'est une sqlite3.OperationalError qui est levée et pas une IOError.

  3. #3
    Membre confirmé Avatar de figarojuju
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Par défaut
    Merci beaucoup !
    ça marche !
    Bonne soirée et merci encore !!

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Par défaut
    Par contre d'un point de vue plus conceptuel, cette méthode me paraît un peu fumeuse : passer par une exception pour détecter qu'une table existe déjà veut dire que :
    - tout autre erreur à l'origine d'une OperationalError durant cette requête sera interprété comme "table déjà créée", même si l'erreur vient d'ailleurs.
    - à partir du second lancement du programme, une exception sera lancée systématiquement à l'initialisation de ton programme. Or une "exception" à mon sens doit-être levée dans un cas... exceptionnel .

    Il me semble qu'il existe dans sqlite une table "sqlite_master" qui contient des infos sur les tables de la base.
    Une requête du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from sqlite_master where type = "table" and name="examen"
    devrait renvoyer un résultat vide si la table "examen n'existe pas.

  5. #5
    Membre confirmé Avatar de figarojuju
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Par défaut
    Bonjour,
    merci de vos réponses !
    j'ai trouvé un truc très intéressant que je pense même assez propre, c'est la possibilité de mettre des conditions sur les créations de table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    self.cur.execute('CREATE TABLE IF NOT EXISTS examen (nom VARCHAR(50))')
    Bonne journée

  6. #6
    Membre confirmé Avatar de figarojuju
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Par défaut
    et avec le tout qui 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
     
    import pygtk
    pygtk.require("2.0")
    import gtk
    import gtk.glade
     
    import sqlite3
     
     
    class lombaire:
        def __init__(self):
            self.widgets = gtk.glade.XML('lombaire.glade',"window1")
            events = {'on_reg_clicked':self.enregistrer,'on_window1_delete_event':self.delete}
            self.widgets.signal_autoconnect(events)
            self.conn=sqlite3.connect('lombaire')
            self.cur=self.conn.cursor()
            self.cur.execute('CREATE TABLE IF NOT EXISTS examen (nom VARCHAR(50))')
     
        def delete(self,source=None,event=None):
            gtk.main_quit()
     
        def enregistrer(self,source=None,event=None):
            self.truc=self.widgets.get_widget('entry1').get_text()
            print self.truc
            self.cur.execute("INSERT INTO examen (nom) VALUES ('%s')" % self.truc)
            self.conn.commit()
     
    if __name__ == '__main__':
        app=lombaire()
        gtk.main()
    Seulement, je n'ai pas très bien compris la différence entre le %s et le '?'...
    bonne journée

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

Discussions similaires

  1. qui connait sqlite ?
    Par Emmanuel Lecoester dans le forum SQLite
    Réponses: 23
    Dernier message: 19/02/2010, 13h44
  2. base de données en sqlite
    Par Cyrillou dans le forum SQLite
    Réponses: 1
    Dernier message: 12/05/2005, 15h37
  3. Installation de Glade?
    Par sali dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 14/01/2005, 17h44
  4. debuter en SQLite
    Par venomelektro dans le forum SQLite
    Réponses: 4
    Dernier message: 08/12/2004, 19h17
  5. Installation d'Anjuta + Glade
    Par Noki dans le forum Applications et environnements graphiques
    Réponses: 12
    Dernier message: 31/03/2004, 23h17

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