Você pode usar o cursor.lastrowid (consulte "Extensões opcionais da API do banco de dados"):
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
Se duas pessoas estiverem inserindo ao mesmo tempo, desde que estejam usando cursor
s diferentes , cursor.lastrowid
retornará o id
para a última linha que foi cursor
inserida:
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
Observe que lastrowid
retorna None
quando você insere mais de uma linha por vez com executemany
:
cursor.executemany('INSERT INTO foo (username,password) VALUES (?,?)',
(('baz','bar'),('bing','bop')))
print(cursor.lastrowid)
# None
last_insert_rowid()
função SQL , permitindo inserir o último ID da linha como uma chave estrangeira em uma próxima instrução de inserção, inteiramente no SQL.last_insert_rowid
debaixo github.com/ghaering/pysqlite/blob/... (que não é garantido threadsafe, mas parece ser a única opção FWIW). Veja também stackoverflow.com/q/2127138/32453INSERT
mas não funcionaUPDATE
. Mas, ao atualizar uma linha, você provavelmente já tem o ID da linha correspondente de qualquer maneira (demorei um pouco para descobrir isso ...).Todos os créditos a @Martijn Pieters nos comentários:
Você pode usar a função
last_insert_rowid()
:fonte