簡體   English   中英

如何使用SqlAlchemy查詢Postgres中的JSON數組?

[英]How to query JSON Array in Postgres with SqlAlchemy?

我定義了一個SqlAlchemy模型

from sqlalchemy.dialects.postgresql import JSONB

class User(db.Model):
    __tablename__ = "user"
    id = db.Column(db.Integer, primary_key=True)
    nickname = db.Column(db.String(255), nullable=False)
    city = db.Column(db.String(255))
    contact_list = db.Column(JSONB)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)

def add_user():
    user = User(nickname="Mike")
    user.contact_list = [{"name": "Sam", "phone": ["123456", "654321"]}, 
                         {"name": "John", "phone": ["159753"]},
                         {"name": "Joe", "phone": ["147889", "98741"]}]
    db.session.add(user)
    db.session.commit()

if __name__ == "__main__":
    add_user()

如何使用手機從我的contact_list中檢索姓名 例如,我有147889 ,我怎樣才能找回

我試過這個

User.query.filter(User.contact_list.contains({"phone": ["147889"]})).all()

但是,它返回一個空列表, []

我怎樣才能做到這一點?

您忘記了您的JSON路徑也應該包含最外層的數組:

User.query.filter(User.contact_list.contains([{"phone": ["147889"]}])).all()

將返回您要查找的用戶。 如果您的JSON包含具有鍵“phone”等的對象,則原始查詢將匹配。請注意,這將返回有問題的User對象,而不是JSON結構中的特定對象/名稱。 如果你想要這樣,似乎是最終目標,你可以擴展每個用戶的數組元素,根據結果記錄進行過濾,並選擇名稱:

val = db.column('value', type_=JSONB)
db.session.query(val['name'].astext).\
    select_from(User,
                db.func.jsonb_array_elements(User.contact_list).alias()).\
    filter(val.contains({"phone": ["147889"]})).\
    all()

另一方面,上面的查詢並不像第一個查詢那樣友好,因為它必須在過濾之前擴展所有數組,因此首先在其聯系人列表中查找包含電話的用戶可能是有益的。子查詢或CTE,然后展開和過濾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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