sql >> Databasteknik >  >> RDS >> PostgreSQL

Skaffa ett föräldrar + barnträd med pg-löfte

Jag är författaren till pg-promise.

När du har 2 tabeller:Parent -> Child med 1-till-många-relation och du vill få en mängd matchande Parent rader, varje rad utökad med egenskapen children inställd på en matris med motsvarande rader från tabellen Child ...

Det finns flera sätt att åstadkomma detta, eftersom kombinationen av pg-löfte och löften i allmänhet är väldigt flexibel. Här är den kortaste versionen:

db.task(t => {
    return t.map('SELECT * FROM Parent WHERE prop1 = $1', [prop1], parent => {
        return t.any('SELECT * FROM Child WHERE parentId = $1', parent.id)
            .then(children => {
                parent.children = children;
                return parent;
            });
    }).then(a => t.batch(a))
})
    .then(data => {
        /* data = the complete tree */
    });

Det här är vad vi gör där:

Först frågar vi efter Parent objekt, sedan mappar vi varje rad till en fråga för motsvarande Child objekt, som sedan ställer in sina rader i Parent och returnerar den. Sedan använder vi metodbatch för att lösa arrayen av Child frågor som returneras från metodkartan.

UPPDATERING för ES7

Här är samma som ovan, men med ES7 async /await syntax:

await db.task(async t => {
    const parents = await t.any('SELECT * FROM Parent WHERE prop1 = $1', [prop1]);
    for(const p of parents) {
        p.children = await t.any('SELECT * FROM Child WHERE parentId = $1', [p.id]);
    }
    return parents;
});
// the task resolves with the correct data tree

Uppgiften kommer att lösas med en array så här:

[
    {
        "parent1-prop1", "parent1-prop2",
        "children": [
            {"child1-prop1", "child1-prop2"},
            {"child2-prop1", "child2-prop2"}
        ]
    },
    {
        "parent2-prop1", "parent2-prop2",
        "children": [
            {"child3-prop1", "child3-prop2"},
            {"child4-prop1", "child4-prop2"}
        ]
    }    
]

API-referenser:karta, batch

UPPDATERA

Se ett bättre svar på detta:JOIN-tabell som en rad resultat med PostgreSQL/NodeJS.




  1. Hur man beräknar skillnaden mellan två datum i SQLite

  2. SQL Server - parametersniffning

  3. Konvertera den nya raden till XML i en Oracle Trigger

  4. Unikt modellfält i Django och skiftlägeskänslighet (postgres)