【问题标题】:Prevent related object persistence in sqlalchemy防止sqlalchemy中的相关对象持久化
【发布时间】: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 属性(更改为Nonemerge),在翻译之前复制对象A 和其他一些选择。改变整个翻译过程,虽然有可能,但我宁愿把它作为最后的选择,因为这是敦促我们的事情。

当 B 得救时,我还能做些什么来防止 A 得救吗?如果您对流程有任何疑问,因为我认为它可能有点混乱,我很乐意回答您。非常感谢

【问题讨论】:

  • 请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。

标签: python sqlalchemy


【解决方案1】:

最后,我采用了另一种方法。我找不到同时存储 A 和 B 的解决方案,但我只是使检查不同,因此翻译不会覆盖原始实例。

【讨论】:

    猜你喜欢
    • 2020-02-11
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多