使用Pyodbc向SQL Server插入数据后如何获取新增行的主键ID?
问题解答
完全可以无需额外发起单独的SELECT查询获取新插入行的自增ID,SQL Server原生支持两种常用实现方案:
方案1:使用SCOPE_IDENTITY()函数
这是最常用的轻量方案,SCOPE_IDENTITY()会返回当前会话、当前作用域内最后生成的自增ID,不会被其他会话或触发器生成的自增值干扰,比@@IDENTITY安全性更高。
修改后的代码如下:
connection = pyodbc.connect(...) cursor = connection.cursor() # 插入语句后直接拼接SELECT SCOPE_IDENTITY(),一次请求完成操作 cursor.execute("insert into employee(firstname, lastname) values(?, ?); SELECT SCOPE_IDENTITY()", ['John','Myers']) # 直接取查询结果的第一个值就是新生成的ID new_employee_id = cursor.fetchone()[0] # 别忘了提交事务(如果没开启自动提交的话) connection.commit()
方案2:使用OUTPUT子句
如果需要同时返回插入行的多个字段,或者担心触发器等场景对SCOPE_IDENTITY()的影响,可以用SQL Server的OUTPUT语法,直接在INSERT语句中指定要返回的字段:
connection = pyodbc.connect(...) cursor = connection.cursor() cursor.execute("insert into employee(firstname, lastname) OUTPUT inserted.ID values(?, ?)", ['John','Myers']) new_employee_id = cursor.fetchone()[0] connection.commit()
两种方案都只需要一次和数据库的交互,不需要单独发起SELECT查询,性能和安全性都能满足常规业务需求。
内容的提问来源于stack exchange,提问作者iammdi
相关产品推荐
相关产品推荐

