gpt4 book ai didi

python - 在 sqlalchemy 中使用 session 范围之外的对象

转载 作者:搜寻专家 更新时间:2023-10-30 23:25:45 25 4
gpt4 key购买 nike

我有一个在某些 API 调用开始时创建的 Job 对象:

class Job(Base):
__tablename__ = 'jobs'
id = Column(BIGINT, primary_key=True)
end_date = Column('end_date', DateTime(timezone=True), nullable=False)
start_date = Column('start_date', DateTime(timezone=True), default=datetime.datetime.utcnow(), nullable=False)
name = Column('name', TEXT, nullable=False)

def __init__(self, name):
self.name = name
self.start_date = datetime.datetime.utcnow()
self.end_date = 'infinity'

调用 api 时,我正在创建一个新作业:

job=Job(name="job1")
session.add(job)
session.commit()
session.close()

但是,在作业开始后,我想将此作业对象作为参数发送给其他一些流程,以便了解哪个作业负责该流程。

问题是在我关闭 session 后我无法使用 Python 对象作业,我会得到以下错误:

sqlalchemy.orm.exc.DetachedInstanceError: Instance <Job at 0x3c67f30> is not bound to a Session; attribute refresh operation cannot proceed (Background on this error at: http://sqlalche.me/e/bhk3)

我想在开始之前保存作业对象。无论如何,我可以在 session 范围之外使用它,但在我保存它之后吗?我知道之后我可以查询它,但我不想,我想使用我创建的同一个作业对象。

我目前的解决方案:

session.add(job)
session.commit()
get_job_id_query = (
session.query
.find(Job.id).filter(Job.end_date == 'infinity')
.filter(Job.name == job.name)
)
job_id = get_job_id_query.all()[0][0]
session.close()

然后我将 id 传递给下一个流程。

最佳答案

session 需要 expire_on_commit如果设置为 False,将使对象在提交后仍可访问的参数。

使用时需要注意,如果数据被另一个 session 更新,“过期”对象将与数据库不同步。

关于python - 在 sqlalchemy 中使用 session 范围之外的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58291247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com