Python을 사용하여 SQLite에 행을 삽입 한 후 삽입 된 ID를 검색하는 방법은 무엇입니까?


176

Python을 사용하여 SQLite에 행을 삽입 한 후 삽입 된 ID를 검색하는 방법은 무엇입니까? 나는 이와 같은 테이블을 가지고있다 :

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

예제 데이터 username="test"및을 사용하여 새 행을 삽입합니다 password="test". 트랜잭션에 안전한 방법으로 생성 된 ID를 어떻게 검색합니까? 이것은 두 사람이 동시에 데이터를 삽입 할 수있는 웹 사이트 솔루션을위한 것입니다. 마지막 읽기 행을 얻을 수 있다는 것을 알고 있지만 이것이 거래 안전하다고 생각하지 않습니다. 누군가 나에게 조언을 해줄 수 있습니까?

답변:


256

cursor.lastrowid를 사용할 수 있습니다 ( "선택적 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

두 사람이 서로 다른 cursors를 사용 하는 한 동시에 삽입 하는 경우 삽입 한 마지막 행에 대해 cursor.lastrowid를 반환합니다 .idcursor

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

다음 을 사용하여 한 번에 둘 이상의 행을 삽입하면 lastrowid반환 None됩니다 executemany.

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

16
개별 커서 인스턴스에 의해 가장 최근의 ID를 리턴 할 것이라고 설명하는 +1
quakkels

43
last_insert_rowid()SQL 함수 도 있으며 , 마지막 삽입 id를 외래 키로 다음 insert 문에 완전히 SQL로 삽입 할 수 있습니다.
Martijn Pieters

2
@MartijnPieters 질문이 꽤 오래되었지만 답변으로 게시 할 수 있습니다. 이 페이지를 읽는 사용자에게 여전히 도움이 될 것입니다.
Daniel Werner

3
파이썬의 sqlite3 lastrowid는 github.com/ghaering/pysqlite/blob/… last_insert_rowid아래에서 사용 됩니다 (스레드 안전은 보장되지 않지만 유일한 옵션은 FWIW 인 것 같습니다). 참조 stackoverflow.com/q/2127138/32453
rogerdpack

2
Btw, 이것은 작동 INSERT하지만 작동 하지 않습니다 UPDATE. 그러나 행을 업데이트 할 때 어쨌든 해당 행 ID가 이미있을 수 있습니다 (이걸 알아내는 데 시간이 걸렸습니다 ...).
CGFoX

4

의견 에 @Martijn Pieters 에 대한 모든 크레딧 :

당신은 기능을 사용할 수 있습니다 last_insert_rowid():

last_insert_rowid()함수는 반환 ROWID함수를 호출하여 데이터베이스 연결에서 마지막 행 삽입의. last_insert_rowid()SQL 함수는 래퍼입니다 sqlite3_last_insert_rowid()C / C ++ 인터페이스 기능.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.