2011-06-05 105 views
116

¿Cómo recuperar el ID insertado después de insertar la fila en SQLite usando Python? Tengo tabla como la siguiente:¿Cómo recuperar el ID insertado después de insertar la fila en SQLite usando Python?

id INT AUTOINCREMENT PRIMARY KEY, 
username VARCHAR(50), 
password VARCHAR(50) 

insertar una nueva fila con datos de ejemplo username="test" y password="test". ¿Cómo recupero la identificación generada en una transacción segura? Esto es para una solución de sitio web, donde dos personas pueden estar insertando datos al mismo tiempo. Sé que puedo obtener la última fila de lectura, pero no creo que sea una transacción segura. ¿Alguien puede darme un consejo?

Respuesta

180

Usted podría utilizar cursor.lastrowid (ver "Extensiones opcional DB API"):

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 dos personas están insertando al mismo tiempo, siempre y cuando se utilizan diferentes cursor s, cursor.lastrowid devolverá el id para la última fila que inserta cursor:

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 

Tenga en cuenta que los rendimientos lastrowidNone cuando se inserta más de una fila en un tiempo con executemany:

cursor.executemany('INSERT INTO foo (username,password) VALUES (?,?)', 
       (('baz','bar'),('bing','bop'))) 
print(cursor.lastrowid) 
# None 
+9

+1 para explicar que devolverá la identificación más reciente mediante esa instancia de cursor individual. – quakkels

+24

También está la ['last_insert_rowid()' función de SQL] (http://www.sqlite.org/lang_corefunc.html#last_insert_rowid), lo que le permite insertar la última fila de identificación como una clave externa en un * siguiente * insertar declaración, completamente en SQL. –

+1

@MartijnPieters Podrías publicar eso como respuesta, aunque la pregunta sea bastante antigua. Todavía podría ayudar a los usuarios que leen esta página. –

Cuestiones relacionadas