Last row id +1

Résolu/Fermé
kanon22 - Modifié le 15 déc. 2021 à 14:11
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 15 déc. 2021 à 14:17
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

jee pee Messages postés 39650 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 26 avril 2024 9 238
Modifié le 12 déc. 2021 à 18:37
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
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
jee pee Messages postés 39650 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 26 avril 2024 9 238
12 déc. 2021 à 20:52
"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
merci enormement jee pee, je vais voir avec ça alors :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Ç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
jee pee Messages postés 39650 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 26 avril 2024 9 238
14 déc. 2021 à 16:55
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
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
15 déc. 2021 à 14:17
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