sql >> データベース >  >> RDS >> PostgreSQL

pg-promiseで親と子のツリーを取得します

    私はpg-promiseの作者です。

    テーブルが2つある場合: Parent -> 1対多の関係で、一致する Parentの配列を取得したい 行、各行はプロパティ childrenで拡張されます テーブルChildの対応する行の配列に設定します ...

    一般にpg-promiseとpromisesの組み合わせは非常に柔軟であるため、これを実現するにはいくつかの方法があります。最短バージョンは次のとおりです:

    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 */
        });
    

    これが私たちがそこで行うことです:

    まず、 Parentをクエリします 次に、各行を対応する Childのクエリにマップします。 アイテム。次に、その行を Parentに設定します。 そしてそれを返します。次に、メソッドbatchを使用して、 Childの配列を解決します。 メソッドマップから返されたクエリ。

    ES7の更新

    これは上記と同じですが、ES7 asyncを使用しています /待つ 構文:

    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
    

    タスクは次のような配列で解決されます:

    [
        {
            "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リファレンス:マップ、バッチ

    更新

    これに対するより良い答えを参照してください:PostgreSQL/NodeJSを使用した結果の配列としてのJOINテーブル。




    1. RMANリストバックアップコマンド

    2. SQLServerデータベースTempDBの予期しない増大を検出して防止する方法

    3. MySQLで先頭と末尾の文字を削除する方法

    4. Oracleを使用してHibernateに最後に挿入された行のIDを取得できません