如何使用 SQLAlchemy 上下文管理器并仍然获取行 ID?
How to use SQLAlchemy contextmanager and still get row ID?
我正在使用 SQLAlchemy 的 provided contextmanager
来为我处理会话。我不明白的是如何获取自动生成的 ID,因为(1)直到调用 commit()
之后才创建 ID(2)新创建的实例仅在上下文管理器的范围内可用:
def save_soft_file(name, is_geo=False):
with session_scope() as session:
soft_file = models.SoftFile(name=name, is_geo=is_geo)
session.add(soft_file)
# id is not available here, because the session has not been committed
# soft_file is not available here, because the session is out of context
return soft_file.id
我错过了什么?
使用session.flush()
在当前事务中执行挂起的命令。
def save_soft_file(name, is_geo=False):
with session_scope() as session:
soft_file = models.SoftFile(name=name, is_geo=is_geo)
session.add(soft_file)
session.flush()
return soft_file.id
如果在 flush
之后但在会话超出范围之前发生异常,更改将回滚到事务的开头。在那种情况下,您的 soft_file
实际上不会被写入数据库,即使它已被赋予一个 ID。
我正在使用 SQLAlchemy 的 provided contextmanager
来为我处理会话。我不明白的是如何获取自动生成的 ID,因为(1)直到调用 commit()
之后才创建 ID(2)新创建的实例仅在上下文管理器的范围内可用:
def save_soft_file(name, is_geo=False):
with session_scope() as session:
soft_file = models.SoftFile(name=name, is_geo=is_geo)
session.add(soft_file)
# id is not available here, because the session has not been committed
# soft_file is not available here, because the session is out of context
return soft_file.id
我错过了什么?
使用session.flush()
在当前事务中执行挂起的命令。
def save_soft_file(name, is_geo=False):
with session_scope() as session:
soft_file = models.SoftFile(name=name, is_geo=is_geo)
session.add(soft_file)
session.flush()
return soft_file.id
如果在 flush
之后但在会话超出范围之前发生异常,更改将回滚到事务的开头。在那种情况下,您的 soft_file
实际上不会被写入数据库,即使它已被赋予一个 ID。