Python으로 MySQL 데이터베이스에 INSERT 한 후 "id"를 얻으려면 어떻게해야합니까?


183

INSERT INTO 문을 실행합니다

cursor.execute("INSERT INTO mytable(height) VALUES(%s)",(height))

기본 키를 얻고 싶습니다.

내 테이블에는 2 개의 열이 있습니다.

id      primary, auto increment
height  this is the other column.

방금 삽입 한 후 "id"를 어떻게 얻습니까?


답변:


243

사용 cursor.lastrowid커서 오브젝트에 삽입 된 마지막 행의 ID를 얻기 위해, 또는 connection.insert_id()해당 연결의 마지막 삽입에서 ID를 얻을 수 있습니다.


3
동일한 연결을 사용하여 두 프로세스가 동시에 행을 삽입하면 어떻게 될까요? 어떤 ID가 insert_id반환됩니까?
xiaohan2012

27
@ xiaohan2012 2 개의 프로세스가 동일한 연결을 어떻게 사용합니까?
hienbt88

5
lastrowid현재 트랜잭션이 커밋 된 후에 만 사용할 수?
John Wang

4
@ hienbt88 아마도 스레드를 의미했을 것입니다. 스레드 안전을 제대로 활용하지 않으면 문제가 발생할 수 있습니다. 커밋 (실제로 자동 커밋)이 효과가 없었기 때문에 각 스레드에 대해 새로운 연결을 인스턴스화하기 위해 개인적으로갔습니다. 초당.
Milan Velebit

삽입, 선택 및 위치를 사용하여 복제 된 레코드에는 작동하지 않습니다.
e-info128

114

또한 cursor.lastrowid(MySQLdb에서 지원하는 dbapi / PEP249 확장) :

>>> import MySQLdb
>>> connection = MySQLdb.connect(user='root')
>>> cursor = connection.cursor()
>>> cursor.execute('INSERT INTO sometable VALUES (...)')
1L
>>> connection.insert_id()
3L
>>> cursor.lastrowid
3L
>>> cursor.execute('SELECT last_insert_id()')
1L
>>> cursor.fetchone()
(3L,)
>>> cursor.execute('select @@identity')
1L
>>> cursor.fetchone()
(3L,)

cursor.lastrowidconnection.insert_id()MySQL에 대한 다른 왕복 보다 다소 저렴 하고 훨씬 저렴합니다.


4
cursor.lastrowid보다 저렴 connection.insert_id()합니까?
Martin Thoma

3
cursor.lastrowid가 cursor.execute ()의 일부로 커서 객체에 자동으로 설정되고 속성 조회 일뿐입니다. connection.insert_id ()는 불필요한 추가 함수 호출입니다.이 함수는 이미 호출되었으며 lastrowid 속성에서 결과를 사용할 수 있습니다.
Andrew

5
방금 cursor.lastrowid다른 것과 다른 것을 반환 하는 데 문제 가 connection.insert_id()있습니다. cursor.lastrowid마지막 삽입 ID를 connection.insert_id()반환 하고를 반환 0합니다. 어떻게 그렇게 될수 있니?
Martin Thoma

1
@moose, 아마도 동시 프로세스가 동일한 연결을 사용하여 병렬 데이터베이스 삽입을 수행하고 있습니다.
xiaohan2012

1
@FlyingAtom은 python3 대신 python2에서 실행 되었기 때문입니다.
앤드류

35

파이썬 DBAPI 사양은 커서 객체에 대한 'lastrowid'속성을 정의하므로 ...

id = cursor.lastrowid

... 작동해야하며 분명히 연결 기반입니다.


7
SELECT @@IDENTITY AS 'Identity';

또는

SELECT last_insert_id();

2
서버에서 마지막 행 ID를 요청하기 때문에 경쟁 조건이 허용됩니다. 나 때문에, 당신은 그 혼란을 원하지 않습니다.
Joshua Burns 2013


1
이 부분도 마찬가지로 중요합니다. "각 클라이언트는 클라이언트가 마지막으로 실행 한 명령문에 대해 마지막으로 삽입 된 ID를받습니다." 동일한 실행하는 것보다 당신은 워크 벤치에서 다른 값을 얻을 것이다 그래서 select last_insert_id()리눅스 시스템에서 CLI에서을
simplycoding

0

이것은 파이썬에서 PyMySql의 요구 사항 일 수도 있지만 ID를 원했던 정확한 테이블의 이름을 지정해야한다는 것을 알았습니다.

에:

cnx = pymysql.connect(host='host',
                            database='db',
                            user='user',
                            password='pass')
cursor = cnx.cursor()
update_batch = """insert into batch set type = "%s" , records = %i, started = NOW(); """
second_query = (update_batch % ( "Batch 1", 22  ))
cursor.execute(second_query)
cnx.commit()
batch_id = cursor.execute('select last_insert_id() from batch')
cursor.close()

batch_id

Out : 5
... 또는 올바른 Batch_ID 값이 실제로 무엇이든


@krzys_h이 K를 찾아 주셔서 감사합니다. 테스트에서 편집이 실패하여 편집을 거부했습니다. 편집 내용도 백업하지 않으시겠습니까?
에드워드
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.