在 python 中使用 MySQLdb 插入 mysql 后,如何安全有效地获取行 ID?

Posted

技术标签:

【中文标题】在 python 中使用 MySQLdb 插入 mysql 后,如何安全有效地获取行 ID?【英文标题】:How do you safely and efficiently get the row id after an insert with mysql using MySQLdb in python? 【发布时间】:2010-10-16 22:40:58 【问题描述】:

我在 mysql 中有一个简单的表,包含以下字段:

id -- 主键、int、自增 名称 -- varchar(50) 说明 -- varchar(256)

使用 MySQLdb,一个 python 模块,我想在表中插入一个名称和描述,并取回 id。

在伪代码中:

db = MySQLdb.connection(...)
queryString = "INSERT into tablename (name, description) VALUES" % (a_name, a_desc);"

db.execute(queryString);
newID = ???

【问题讨论】:

复制How do I get the IDENTITY / AUTONUMBER value for the row I inserted in pymysql,这是一个更好的问答对;这个答案接受了错误的答案,并在下面编辑了正确的答案,这很奇怪而且没有帮助。 【参考方案1】:

我觉得可能

newID = db.insert_id()

由原始海报编辑

原来,在我使用的 MySQLdb 版本中 (1.2.2) 您将执行以下操作:

conn = MySQLdb(host...)

c = conn.cursor()
c.execute("INSERT INTO...")
newID = c.lastrowid

我将此作为正确答案,因为它让我指出了正确的方向。

【讨论】:

如果您没有自动提交,请在提交之前执行此操作。 @kmarsh 我知道这条评论很老了,但你还记得为什么它应该在提交之前吗? 我猜是因为代码是用光标完成的,提交后会丢失上下文。更简短的答案,这样对我来说效果更好。 如果我们有两个并发处理在数据库中插入新记录的情况怎么办?它将返回正确的记录ID的真实性是什么?【参考方案2】:

最简单的方法是将带有选择计数查询的插入包装到单个存储过程中,然后在代码中调用它。您可以将所需的参数传递给存储过程,然后它会选择您的行数。

【讨论】:

【参考方案3】:

我不知道有没有专门针对这个的MySQLdb API,但是一般你可以通过SELECTing LAST_INSERT_ID()获取最后插入的id

它是基于每个连接的,因此如果其他客户端也执行插入操作,您不会冒竞争条件的风险。

【讨论】:

【参考方案4】:

你也可以做一个

conn.insert_id

【讨论】:

以上是关于在 python 中使用 MySQLdb 插入 mysql 后,如何安全有效地获取行 ID?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用python mysqldb一次插入多行

使用 MySQLdb 插入 MySQL - python

Python MySQLdb没有插入数据

Python MySQLdb 面向对象

MySQLdb使用批量插入executemany方法插入mysql

MySQLdb Python 插入 %d 和 %s