SQLAlchemy(版本1.4!)-获取最后插入的ID

3

如何获取最后插入的id?请注意sqlalchemy版本,因此这个问题不适用于我。

我尝试过:

async def foo(db_session: AsyncSession, login):
    r1 = await db_session.execute(statement=models_users.insert().values(login=login))
    r2 = await db_session.flush()
    # r3 = await db_session.fetchval(...)  # Error, no such method for async
    r4 = await db_session.commit()
    print(r2, r4, r1.fechone())  # None, None, None
    print(r1.lastrowid)  # 'AsyncAdapt_asyncpg_cursor' object has no attribute 'lastrowid'


SQLAlchemy        1.4.4
asyncpg           0.22.0

你的问题是关于缺失的fetchval方法吗?我认为在任何SQLAlchemy版本中都不存在这个东西。 - Paul Becotte
1个回答

1
SQLAlchemy对lastrowid的支持取决于底层的DB-API实现,因此依赖于该属性不安全。然而,SQLAlchemy在CursorResult对象上提供了一个inserted_primary_key属性,应该是可靠的。
返回值是插入行的主键值的元组。
问题中代码的这个版本:
async def foo(db_session: AsyncSession, login):
    r1 = await db_session.execute(statement=models_users.insert().values(login=login))
    print(r1)
    print('Last pk', r1.inserted_primary_key)
    await db_session.flush()
    await db_session.commit()

会产生如下输出:
<sqlalchemy.engine.cursor.CursorResult object at 0x7f0215966bb0>
Last pk (17,)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接