使用Python插入MySQL数据库后,如何获得“ id”?


Answers:


243

使用cursor.lastrowid得到插入光标对象的最后一行ID,或者connection.insert_id()从该连接上最后插入获取的ID。


3
如果两个进程使用同一连接同时插入一行怎么办?哪个ID将insert_id返回?
xiaohan2012 2014年

26
@ xiaohan2012 2个进程如何使用相同的连接?
hienbt88

5
lastrowid只可被提交当前事务后?
John Wang

4
@ hienbt88他可能是线程,我已经这样做了,除非您正确利用线程安全性,否则它可能会引起问题。我亲自为每个线程实例化一个新的连接,这是一个可爱的解决方法,因为由于某种原因提交(实际上是自动提交)对我不起作用,由于许多并发线程都发出了一些查询,所以我进行了认真的交织每秒。
米兰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.lastrowidconnection.insert_id()呢?
马丁·托马

3
仅因为cursor.lastrowid作为cursor.execute()的一部分自动在光标对象上设置,并且仅是属性查找。connection.insert_id()是一个额外的不必要的函数调用-已被调用,并且其结果在lastrowid属性上可用。
2014年

5
我刚刚遇到了一个问题,该问题cursor.lastrowid返回的内容不同于connection.insert_id()cursor.lastrowid返回最后一个插入ID,connection.insert_id()返回0。怎么可能?
Martin Thoma 2014年

1
@moose,也许并发进程正在使用同一连接进行并行数据库插入。
xiaohan2012 2014年

1
@FlyingAtom,因为它是在python2而不是python3上运行的。
安德鲁

35

Python DBAPI规范还为光标对象定义了“ lastrowid”属性,因此...

id = cursor.lastrowid

...也应该起作用,并且显然基于每个连接。


7
SELECT @@IDENTITY AS 'Identity';

要么

SELECT last_insert_id();

2
这允许出现争用情况,因为您要从服务器请求最后一个行ID。因为我,你不要那样的混乱。
约书亚·伯恩斯


1
我想指出的是,这部分同样重要:“每个客户端将收到客户端执行的最后一条语句的最后插入的ID。” 因此select last_insert_id(),与在Linux机器上从CLI 运行完全相同的结果相比,从Workbench获得的价值将有所不同
只需对
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.