0

Ниже приведен образец массива JSONB. Я пытаюсь понять, как написать запрос, который не требует такого перекрестного продукта.Есть ли лучший способ написать этот запрос Postgres JSONB?

select b.id from brand b,jsonb_array_elements (b.tree) a where a#>>'{Name}' = 'Skiing'; 

Бонусные баллы за помощь мне перевести это в SQL алхимии

[ 
    { 
    "Name": "Snowboarding", 
    "Order": 1, 
    "Categories": { 
     "Jackets": [ 
     22002, 
     23224 
     ], 
     "Helmets": [ 
     24920 
     ], 
     "Freestyle Boards": [ 
     20164 
     ], 
     "Goggles": [ 
     23169, 
     23280 
     ], 
     "Hats": [ 
     22966, 
     21727 
     ], 
     "Bindings": [ 
     19265 
     ], 
     "Gloves": [ 
     20461 
     ], 
     "Boots": [ 
     26374, 
     19079, 
     21765, 
     22669 
     ], 
     "Freeride Boards": [ 
     18395, 
     25505 
     ], 
     "Pants": [ 
     24143, 
     20957 
     ] 
    } 
    }, 
    { 
    "Name": "Skiing", 
    "Order": 2, 
    "Categories": { 
     "Jackets": [ 
     22518, 
     25791, 
     19972 
     ], 
     "Pants": [ 
     17516, 
     23113 
     ], 
     "Goggles": [ 
     25066, 
     20996 
     ], 
     "Helmets": [ 
     24378 
     ], 
     "Hats": [ 
     20009, 
     21245 
     ], 
     "Cross-country Skiing": [ 
     17464 
     ], 
     "Gloves": [ 
     25822 
     ], 
     "Boots": [ 
     16616 
     ], 
     "Poles": [ 
     19280 
     ] 
    } 
    },....] 

ответ

1

SQL решение первой:

SELECT brand.id 
FROM brand 
WHERE brand.tree @> '[{"Name": "Skiing"}]'::jsonb; 

Что касается sqlalchemy версии, вы можете просто использовать contains для того, чтобы генерировать SQL выше:

q = (session.query(Brand.id) 
    .filter(Brand.tree.contains([{"Name": "Skiing"}])) 
    ) 
+0

сладкий, мне не хватало внешних кронштейнов – Trent

Смежные вопросы