मैं निम्नलिखित पोस्टग्रेज क्वेरी को Sqlalchemy 1.4 में अनुवाद करने का प्रयास कर रहा हूं:

SELECT json_build_object(
               'type', 'FeatureCollection',
               'features', json_agg(
                       json_build_object(
                           'type', 'Feature',
                           'geometry', geom,
                           'properties', (
                                select json_build_object(
                                    'id', hi.id,
                                    'responses', (
                                        select json_object_agg(e.etype, er.response)
                                        from expert e
                                            inner join expertresponse er on e.id = er.expert_id
                                        where infra_id = hi.id
                                    ),
                                    'protections', (
                                    select json_object_agg(p.ptype, i.pscore)
                                    from protection p
                                        inner join infraprotection i on p.id = i.protection_id
                                    where infra_id = hi.id
                                    )
                                )
                            )
                        )
                   )
           ) as allinfra
from hardinfra hi;

इसलिए मैं उपश्रेणियों को उसी क्रम में परिभाषित करता हूं:

responses = (
    db.session.query(
        (func.json_object_agg(Expert.etype, Expert_Response.response)).label(
            "responses"
        )
    )
    .join(Expert_Response.exp)
    .filter(Expert_Response.infra_id == Hardinfra.id)
    .scalar_subquery()
)

protections = (
    db.session.query(
        (func.json_object_agg(Protection.ptype, Infra_Protection.pscore)).label(
            "protections"
        )
    )
    .join(Infra_Protection.prot)
    .filter(Infra_Protection.infra_id == Hardinfra.id)
    .scalar_subquery()
)

properties = db.session.query(
    (
        func.json_build_object(
            "id", Hardinfra.id, "protections", protections, "responses", responses
        ).label("properties")
    )
).scalar_subquery()

features = db.session.query(
    (
        func.json_build_object(
            "type",
            "Feature",
            "geometry",
            Hardinfra.geom,
            "properties",
            properties,
        ).label("features")
    )
).scalar_subquery()

q = db.session.query(
    func.json_build_object(
        "type", "FeatureCollection", "features", func.json_agg(features)
    )
)

हालांकि जब features का मूल्यांकन किया जाता है तो मुझे एक (psycopg2.errors.CardinalityViolation) more than one row returned by a subquery used as an expression त्रुटि मिलती है। मुझे यह भी यकीन नहीं है कि properties और features को स्केलर सबक्वेरी होने की जरूरत है (responses और protections निश्चित रूप से करते हैं), लेकिन मैं स्पष्ट रूप से कुछ और भी गलत कर रहा हूं, शायद आंतरिक Hardinfra बाहरी रेफरी से संबंधित होने के साथ क्या करना है? मुझे यकीन नहीं है…

4
urschrei 2 नवम्बर 2021, 19:27

1 उत्तर

सबसे बढ़िया उत्तर

यह अनावश्यक उपश्रेणियों के कारण हो सकता है, आप अंतिम दो उपश्रेणियों को निकालने का प्रयास कर सकते हैं।

responses = (
    db.session.query(
        (func.json_object_agg(Expert.etype, Expert_Response.response)).label(
            "responses"
        )
    )
    .join(Expert_Response.exp)
    .filter(Expert_Response.infra_id == Hardinfra.id)
    .scalar_subquery()
)

protections = (
    db.session.query(
        (func.json_object_agg(Protection.ptype, Infra_Protection.pscore)).label(
            "protections"
        )
    )
    .join(Infra_Protection.prot)
    .filter(Infra_Protection.infra_id == Hardinfra.id)
    .scalar_subquery()
)

properties = func.json_build_object(
            "id", Hardinfra.id, "protections", protections, "responses", responses
        )

features = func.json_build_object(
            "type",
            "Feature",
            "geometry",
            Hardinfra.geom,
            "properties",
            properties,
        )

q = db.session.query(
    func.json_build_object(
        "type", "FeatureCollection", "features", func.json_agg(features)
    )
)
3
emptyhua 5 नवम्बर 2021, 05:17