python - 带有“&”运算符的 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 查询?
我们可以使用自连接来使用别名函数来实现这一点吗?
解决方案
推荐阅读
- mysql - postgres:在用户首次登录时强制更改密码
- typescript - 如何将 NestJS 配置注入 TypeORM 实体?
- html - 改变相同属性的多个 CSS 类
- java - Java OffsetDateTime 显示奇怪的年份值
- asp.net-web-api2 - .NetCore 3.1 API 在将 Asp.NetCore.Odata 用于 REST API 时出现问题
- python - 重命名数据框中具有相似名称的行值
- delayed-job - 如何与不同的工作人员正确运行监控
- qliksense - 如何在 Qlik Sense 的过滤器面板中对选项进行分组
- linux - Socat - 如何创建一个 Windows 反向外壳
- python-3.x - 有没有办法用熊猫读取 BeautifulSoup 输出来读取表格?