Last row id +1

Résolu
kanon22 -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour tout le monde,

Je suis débutant en python et mysql, et je bloque sur un petit problème.

J'ai créé un petit formulaire à remplir qui s'enregistre sur mysql, mais là où ça cloche c'est lorsque j'essaye de faire un ID automatique. Je voulais tout simplement récupérer le dernier ID, via :
lastid = mycursor.lastrowid
et tout bêtement rajouter 1. Mais j'ai beau essayer, ça ne fonctionne pas.

Pourriez-vous m'aider s'il vous plait ?

def Add():
    username = e2.get()
    password = e3.get()
    numero = e4.get()

    mysqldb = mysql.connector.connect(
        host='localhost',
        user='root',
        password='******',
        port='3306',
        database='testmysqlw'
    )
    mycursor = mysqldb.cursor()

    try:
       lastid = mycursor.lastrowid
       print(lastid)

       sql = "INSERT INTO  users (id,username,password,numero) VALUES (%s, %s, %s, %s)"
       val = (lastid,username,password,numero)
       mycursor.execute(sql, val)
       mysqldb.commit()

       messagebox.showinfo("information", "Employee inserted successfully...")
       # id = e1.get()

       e2.delete(0, END)
       e3.delete(0, END)
       e4.delete(0, END)
       e2.focus_set()
    except Exception as e:
       print(e)
       mysqldb.rollback()
       mysqldb.close()


Configuration: Windows / Chrome 91.0.4472.101

7 réponses

  1. jee pee Messages postés 31883 Date d'inscription   Statut Modérateur Dernière intervention   9 979
     
    Bonjour,

    Je ne suis pas utilisateur de mysql, donc mes remarques ne sont que des pistes.

    Vous ne nous avez pas donné le message d'erreur qui est rendu à l'exécution.
    Vous récupérez lastid mais il n'y a pas le +1
    Dans un SGBD le rowid n'est pas nécessairement un simple numéro d'ordre, mais dans mysql ??? Et si le rowid est un nombre simple, compteur des lignes, une suppression pourrait tout faire échouer, 3 enregistrements, 1,2,3 rowid=3, suppression du 2, rowid=2, insertion 2+1 ==> duplicate id.
    Pour récupérer le dernier id utilisé on pourrait faire un select max(id) from table.
    Et souvent, si l'id n'est pas significatif on se s'embête pas à le gérer, on définit une table avec un champ automatique auto incrémenté.

    0
  2. kanon22
     
    salut, merci de ta réponse.
    le message qui apparait est : "1048 (23000): Column 'id' cannot be null"
    mais pour l'auto incrémentation, j'ai croisé des tutos sur ça sans trop y faire attention, du coup, je vais faire des recherches pour ça.
    donc merci bcpppp. je reviendrai dès que je trouve une solution ;)
    0
  3. jee pee Messages postés 31883 Date d'inscription   Statut Modérateur Dernière intervention   9 979
     
    "Column 'id' cannot be null" clairement ton lastid n'est pas initialisé

    et quand on recherche .lastrowid on voit que cette propriété n'est initialisée qu'après un insert ou update. Or toi tu n'as encore rien fait comme action : https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-lastrowid.html

    et surtout c'est utilisé pour après une insertion renvoyer l'id généré sur un champ auto_increment, c'est donc bien autour de cette notion qu'il faut chercher
    0
  4. kanon22
     
    merci enormement jee pee, je vais voir avec ça alors :)
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. kanon22
     
    Ça marche !

    D'abord, il faut changer l'ID dans mysql en
    auto increment
    et pour cela il faut cliquer sur "IA", sinon
    auto increment
    " reste verrouillé.

    Puis au niveau du code :

           sql = "INSERT INTO  users (id,username,password,numero) VALUES (%s, %s, %s, %s)"
           val = (0, username, password, numero)
           mycursor.execute(sql, val)
           mysqldb.commit()
           lastid = mycursor.lastrowid
           e1.delete(0, END)
           e1.insert(END, lastid)


    Donc merci encore une fois :D
    0
  7. jee pee Messages postés 31883 Date d'inscription   Statut Modérateur Dernière intervention   9 979
     
    Bravo ! c'est comme cela qu'il faut travailler, tester, faire des recherches sur les instructions que l'on utilise, poser des questions quand on bloque.

    Juste une observation, vérifier si c'est comme cela que ça fonctionne dans Mysql. A mon avis, dans l'insert on n'a pas besoin de préciser le champ id et sa valeur 0, on peut s'en passer le champ étant auto généré. Cela allège le code.
    0
  8. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    Bonjour,

    Quelques petites clarifications, qui confirme ce que suspecte jee pee :
    • En MySQL il existe une fonction pour auto incrémenter l'identifiant. Ce n'est pas le cas de tous les SGBD, mais comme MySQL le permet, autant en profiter.
    • Cela se spécifie au moment de créer la table (ou en altérant la table). Si la table est créée via du code, cela se précise dans l'instruction
      CREATE TABLE ...
      . Si la table existe déjà, on peut activer se comportement via un client MySQL.
    • Quand l'auto incrément est activé, il n'est pas utile de spécifier l'ID au moment d'insérer le tuple dans la table, MySQL se débrouille.


    Exemple :

    CREATE TABLE animals (
         id MEDIUMINT NOT NULL AUTO_INCREMENT,
         name CHAR(30) NOT NULL,
         PRIMARY KEY (id)
    );
    
    INSERT INTO animals (name) VALUES
        ('dog'),('cat'),('penguin'),
        ('lax'),('whale'),('ostrich');
    
    SELECT * FROM animals;


    Bonne chance
    0