Comment récupérer l'id inséré après avoir inséré une ligne dans SQLite en utilisant Python? J'ai table comme ça:
id INT AUTOINCREMENT PRIMARY KEY,
username VARCHAR(50),
password VARCHAR(50)
J'insère une nouvelle ligne avec des exemples de données username="test"
et password="test"
. Comment récupérer l'identifiant généré de manière sécurisée pour les transactions? Ceci est pour une solution de site Web, où deux personnes peuvent être en train d'insérer des données en même temps. Je sais que je peux obtenir la dernière ligne de lecture, mais je ne pense pas que la transaction soit sécurisée. Quelqu'un peut-il me donner des conseils?
Vous pouvez utiliser cursor.lastrowid (voir "Extensions d'API DB facultatives"):
connection=sqlite3.connect(':memory:')
cursor=connection.cursor()
cursor.execute('''CREATE TABLE foo (id integer primary key autoincrement ,
username varchar(50),
password varchar(50))''')
cursor.execute('INSERT INTO foo (username,password) VALUES (?,?)',
('test','test'))
print(cursor.lastrowid)
# 1
Si deux personnes insèrent en même temps, tant qu'elles utilisent des _cursor
s, cursor.lastrowid
retournera le id
pour la dernière ligne que cursor
a insérée:
cursor.execute('INSERT INTO foo (username,password) VALUES (?,?)',
('blah','blah'))
cursor2=connection.cursor()
cursor2.execute('INSERT INTO foo (username,password) VALUES (?,?)',
('blah','blah'))
print(cursor2.lastrowid)
# 3
print(cursor.lastrowid)
# 2
cursor.execute('INSERT INTO foo (id,username,password) VALUES (?,?,?)',
(100,'blah','blah'))
print(cursor.lastrowid)
# 100
Notez que lastrowid
renvoie None
lorsque vous insérez plusieurs lignes à la fois avec executemany
:
cursor.executemany('INSERT INTO foo (username,password) VALUES (?,?)',
(('baz','bar'),('bing','bop')))
print(cursor.lastrowid)
# None