首页 > 解决方案 > 带有“&”运算符的 SQLAlachemy 过滤器并为过滤器提供 SQL 查询

问题描述

我有三个表,它们的类如下所示,

class Values(db.Model):
    __tablename__ = 'values'
                    
    id = db.Column(db.Integer, ForeignKey('identities.id'), primary_key=True)
    attribute = db.Column(db.Integer, ForeignKey('attributes.id'), primary_key=True)
    value = db.Column(JSONB)

    def __repr__(self):
        return f"<Values {self.id}>"


class Identities(db.Model):
    __tablename__ = 'identities'

    id = db.Column(db.Integer, primary_key=True)
    uuid = db.Column(db.Text)

    user_data = db.relationship(Values, backref='identities')

    def __repr__(self):
        return f"<Identities {self.id}>"


class Attributes(db.Model):
    __tablename__ = 'attributes'

    id = db.Column(db.Integer, primary_key=True)
    schema = db.Column(db.Integer, ForeignKey('schemas.id'))
    name = db.Column(db.Text)
    syntax = db.Column(JSON)

    user_attribute = db.relationship(Values, backref='attributes', primaryjoin=id == Values.attribute)

    def __init__(self, name, syntax, id, schema):
        self.name = name
        self.syntax = syntax
        self.id = id
        self.schema = schema

    def __repr__(self):
        return f"<Attributes {self.name}>"

可以说,这些表中的示例数据如下:-

价值观

1, 1, "基兰"

1、2、“库马尔”

身份

1、一

属性

1, 1, "用户名", 'a'

2, 1, "显示名称", 'b'

如您所见,从身份到值表的关系是一对多的,值表中的两个条目都属于身份表中的单一身份。

我有一个过滤器,例如“获取 userName 为 'kiran' 且 displayName 为 'kumar' 的所有身份”。

我为此编写了一个 sqlalchemy 查询,这是不正确的。

db.session.query(Identities).join(Values, Identities.id == Values.id).filter(((Attributes.name=='userName') & (cast(Values.value, db.String())=='"kiran"')) & ((Attributes.name=='displayName') & (cast(Values.value, db.String())=='"kumar"'))).all()

上述查询按预期不返回任何结果。但是,当我将其设为or操作时,它会返回结果。

原因是查询中没有“身份”表的上下文,并且1, 1, "kiran"此行上为 userName 和 displayName 执行 and 显然不会返回任何结果。

你如何为这个问题构建正确的查询?

或者

能否为上述表格和条件提供基本的 SQL 查询?

我们可以使用自连接来使用别名函数来实现这一点吗?

标签: pythonpostgresqljoinsqlalchemy

解决方案


推荐阅读