web-dev-qa-db-fra.com

Comment récupérer l'id inséré après avoir inséré une ligne dans SQLite en utilisant Python?

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?

148
Jane

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 _cursors, 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
224
unutbu