【发布时间】:2022-10-25 17:45:06
【问题描述】:
环境
- Python 3.8.10
- SQLAlchemy 1.3.22
问题
我遇到了与此处所述相关的问题,但还没有找到解决方案:How to prevent related object persistence in sqlalchemy?
我有两个具有一对多关系的模型:
class A:
b = db.relationship("B", back_populates="a", cascade="all,delete")
class B:
a_id = db.Column('A_ID', db.Integer, db.ForeignKey('A.ID'), nullable=False)
a = db.relationship('A', back_populates="b")
问题是在某个时刻,我需要修改 B 的某个字段。为此,我需要访问与当前 B 对象相关的对象 A 进行一些检查。但是,由于 A 是一个使用翻译的类,我们需要牢记这一点。
translate 所做的是在当前实例中覆盖 A 的可翻译字段,而不将它们存储在数据库中(由于向后兼容性,我们将翻译放在不同的表上)。我需要进行翻译以进行检查并获得我应该设置为 B 的正确值。问题如下:
# some_service.py
def get_by_id(a_id):
a = A.get_by_id(a_id)
if a:
return translate(a)
# file_y.py
def get_value_to_update_b(a_id)
a = some_service.get_by_id(a_id)
# do some stuff without saving anything to A
# file_x.py
b = B.get_by_id(id) # At this point, b.a stores the original A object
value = file_y.get_value_to_update_b(b.a_id) # After this executes, b.a points to the translated one, instead of the original, so when B is saved, the translated A is saved too.
b.value = value
session.add(b)
session.commit()
如您所见,问题是当我翻译 A 进行检查时,来自 B 的引用更新为A_translated,所以当我保存 B 时,A 也与翻译后的值一起保存,这是不正确的。
我已经尝试修改关系的cascade 属性(更改为None 和merge),在翻译之前复制对象A 和其他一些选择。改变整个翻译过程,虽然有可能,但我宁愿把它作为最后的选择,因为这是敦促我们的事情。
当 B 得救时,我还能做些什么来防止 A 得救吗?如果您对流程有任何疑问,因为我认为它可能有点混乱,我很乐意回答您。非常感谢
【问题讨论】:
-
请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。
标签: python sqlalchemy