在 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?的主要内容,如果未能解决你的问题,请参考以下文章