我正在使用 Python 2.7 的 mysql.connector 模块。我已将代码分解为最简单的脚本,但我仍然遇到此问题。问题是,当我尝试获取最后一行 id(在 MySQL 中将是 LAST_INSERT_ID)时,无论插入了多少行,我都会得到 0 的返回值。有没有人有这个问题的解决方案?

我的代码如下:

import mysql.connector
default_config = {
    'user': 'root',
    'password': 'password',
    'host': '127.0.0.1',
    'database': 'test',
    'raise_on_warnings': True,
    'autocommit': True
    }
connection = mysql.connector.connect(**default_config)
cursor = connection.cursor()
args = ('name', 'desc')
cursor.callproc('sp_tools_insert', args)
lastid = cursor.lastrowid
print lastid # This returns 0 every time, regardless of number of inserts

我的存储过程如下所示:
CREATE PROCEDURE `sp_tools_insert`
    (
        IN p_name VARCHAR(45),
        IN p_description VARCHAR(255)
    )
BEGIN
INSERT INTO TOOLS
    (
        tool_name,
        description
    )
VALUES
    (
        p_name,
        p_description
    );
END

这是我的 TOOLS 表的定义方式:
DROP TABLE IF EXISTS `test`.`TOOLS` ;

CREATE TABLE IF NOT EXISTS `test`.`TOOLS` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `tool_name` VARCHAR(45) NOT NULL,
  `description` VARCHAR(255) NOT NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;

我已经验证存储过程正常工作并且 .callproc() 调用按预期工作。唯一不起作用的是 .lastrowid 调用。有什么建议么?

最佳答案

lastrowid 属性:



而且您还没有运行INSERTUPDATE语句,而是运行了CALL语句。

要获取详细信息,您必须遵循mysql_insert_id调用的 lastrowid 函数的C API文档的链接。特别是:



我在这里假设您的TOOLS表实际上确实有一个AUTO_INCREMENT列;否则,您毫无值(value)可言。

另外,请注意,这只是与您的断言相反的方式之一,lastrowidLAST_INSERT_ID()是不同的东西。值得阅读 LAST_INSERT_ID 的文档。

10-07 14:01