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.