如何使用sqlalchemy在PostgresJSONB中查找嵌套值?

2024-10-03 00:26:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个带有JSONB列名的postgres表entity。json结构的示例如下:

{
  "some_key": "some value",
  "properties": {
    "name": ["name_value"],
  }
}

我需要通过name_value查找记录。我可以使用查询来获得它:

SELECT entity FROM my_table where entity->'properties' @> {"name": ["name_value"]};

问题是:我找不到使用sqlalchemy ORM创建相同查询的方法

更新: 我的模型是动态的,因为多个表使用相同的结构,只是表名不同。代码如下:

...
Base = declarative_base(engine)

class ForeignBase(AbstractConcreteBase, Base):
    pass

def make_model(name):
    class Entity(ForeignBase):
        __tablename__ = name
        __mapper_args__ = {"polymorphic_identity": name, "concrete": True}
        __table_args__ = {"extend_existing": True}

        id = Column(String, primary_key=True)
        entity = Column(JSONB, nullable=True)
        ...
    configure_mappers()
    return Entity

然后,我使用3个函数启动我的模型,并获得我当前需要的一个:

def get_model_list():
    tables_names_list = get_table_name_list()
    model_list = [make_model(PREFIX + table_name) for table_name in tables_names_list]
    return model_list

def get_tables_dict():
    return {table.__tablename__: table for table in ForeignBase.__subclasses__()}

def get_table_object(table_name):
    return get_tables_dict().get(table_name)

Tags: nametruetablesgetmodelreturnvaluedef
1条回答
网友
1楼 · 发布于 2024-10-03 00:26:04

您可以使用以下SQLAlchemy表达式。运营商@>;JSONB列的SQLAlchemy中包含()

Session().query(MyTable).filter(MyTable.entity["properties"].contains({"name": ["name_value"]})).with_entities(MyTable.entity).all()

相关问题 更多 >