簡體   English   中英

sqlalchemy:在父表和子表之間“同步”jsonb 列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM