[英]SQLalchemy: Could not determine join condition between parent/child tables on relationship
[英]sqlalchemy: "syncing" jsonb column between parent and child tables
假設我們有兩個 sqlalchemy 類
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.dialects.postgresql import JSONB
db = SQLAlchemy()
class Parent(db.Model):
id = db.Column(db.Integer, primary_key=True)
data = db.Column(JSONB)
class Child(db.Model):
id = db.Column(db.Integer, primary_key=True)
parent_id = db.Column(db.Integer, db.ForeignKey("parent.id"))
parent = db.relationship(Parent, backref="children")
data = db.Column(JSONB)
的含量Child.data
是字典d
和內容Parent.data
是字典列表,一個用於每個子,即parent.data = [child.data for child in parent.children]
。
有沒有辦法讓兩個data
列保持同步?
原則上,例如可以去掉Parent.data
列並將其替換為一個屬性,該屬性只返回[child.data for child in parent.children]
。 但是,在我們的用例中,這很慢,因此我們希望在Parent.data
列中保留聚合數據的Parent.data
。 此外,應用程序的某些部分會一次修改整個Parent.data
,而其他部分會修改Child.data
。 我考慮過將data
設為“私有”並編寫一個自動更新另一個表中相應列的 setter(可能會在更新之前檢查它是否已更改,以避免最終陷入無限循環)。 有沒有更好的辦法?
謝謝 :)
您可能想要使用事件偵聽器。 類似於下面的內容應該這樣做,具體取決於您的 json 的結構
import sqlalchemy as sa
@sa.event.listens_for(Parent.data, "modified")
def _parent_data_modified(parent, data, initiator):
for child in parent.children:
# adjust for your data structure
child.data = data[child.id]
@sa.event.listens_for(Child.data, "modified")
def _child_data_modified(child, data, initiator):
old_data = parent.data.copy()
old_data[child.id] = data
parent.data = old_data
https://docs.sqlalchemy.org/en/13/orm/extensions/mutable.html#receiving-events
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.