在 python 中运行 session.execute 后获取插入行的主键

Posted

技术标签:

【中文标题】在 python 中运行 session.execute 后获取插入行的主键【英文标题】:Get primary key of inserted row after session.execute has run in python 【发布时间】:2021-09-07 15:24:34 【问题描述】:

我有一个名为报告的 MS SQL 表,其结构如下。我想获取刚刚插入的行的row_id:

r_id int NOT NULL IDENTITY,
report_type int,
report_source varchar,
received_date datetime,

我创建了一个引擎和 session_scope() 来处理连接。我的代码如下所示:

with session_scope() as session:
    result_object = session.execute("""INSERT INTO reports (report_type, report_source, received_date) VALUES (3, 'Email', '24-06-2021 12:00')""")
    session.commit()
    for res in result_object:
        print "report id of inserted row is: ", res['r_id']

除此之外,我还尝试了 fetchone() 但我总是收到以下错误:

ResourceClosedError:此结果对象不返回行。它已自动关闭。

出于绝望,我也尝试在查询末尾添加“RETURNING *”,但我得到“ProgrammingError: Incorrect syntax near 'RETURNING'。”还有什么其他可靠的方法来获取已加载行的报告 ID。 PS。我不想使用 ORM,我知道这可以在 ORM 中通过 session.add(object) 然后“object.r_id”轻松完成。当我使用查询时,我们该怎么做?

【问题讨论】:

nt result_object.lastrowid 有效吗?我认为你必须在提交之前这样做。 不,我收到另一个错误,因为“AttributeError: 'pyodbc.Cursor' 对象没有属性 'lastrowid'” 我会回复并提供一个例子 【参考方案1】:

也许你可以使用 OUTPUT (https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql?redirectedfrom=MSDN&view=sql-server-ver15)。假设您的 id 列是report_id

"""INSERT INTO reports (report_type, report_source, received_date) 
OUTPUT Inserted.report_id 
VALUES (3, 'Email', '24-06-2021 12:00')"""

【讨论】:

是的,就是这样。当我执行 result_object.fetchone() 时,它运行良好。非常感谢@karolos K

以上是关于在 python 中运行 session.execute 后获取插入行的主键的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 上使用 paramiko 处理 awk 逗号? [复制]

在windows中:双击运行Python程序后台运行Python程序

在 python 脚本中检查正在运行的 python 脚本

在python脚本中运行powershell脚本,如何让python在运行时打印powershell输出

强制脚本在 Python 3 中运行

Python不会在bash中运行,但会在cmd中运行[重复]