【发布时间】:2025-12-28 02:35:06
【问题描述】:
我有一种感觉,我让事情变得比他们需要的更复杂 - 这不可能是如此罕见的情况。在我看来,这应该是可能的——或者我做的事情根本上是错误的。
手头的问题是:我已经声明了一个数据库元素Element,它由大约10个与其他元素的多对多关系组成,其中一个是Tag。
我想让我的应用程序的用户能够通过所有这些关系过滤Element,其中一些关系或一个都没有。假设用户只想查看与某个Tag 相关的Elements。
为了让事情变得更加困难,将执行此目标的函数是从 graphql API 调用的,这意味着它将接收 ID 而不是 ORM 对象。
我正在尝试使用 SQLAlchemy 在我的 Python Flask 项目中构建解析器,它将提供如下界面:
# graphql request
query getElements {
getElements(tags:[2, 3] people:[8, 13]) {
id
}
}
# graphql response
{
"data": {
"getElements": [
{
"id": "2"
},
{
"id": "3"
},
{
"id": "8"
}
]
}
}
我想解析器看起来像这个简化的伪代码,但我终其一生都想不出如何实现它:
def get_elements(tags=None, people=None):
args = {'tags' : tags, 'people' : people}
if any(args):
data_elements = DataElement.query.filter_by(this in args) # this is the tricky bit - for each of DataElements related elements, I want to check if its ID is given in the corresponding argument
else:
data_elements = DataElement.query.all()
return data_elements
根据要求,这里是简化的数据库模型。 DataElement 有很多这样的关系,而且效果很好:
class DataElement(db.Model):
__tablename__ = 'DataElement'
id = db.Column(db.Integer, primary_key=True)
tags = db.relationship('Tag', secondary=DataElementTag, back_populates='data_elements')
class Tag(db.Model):
__tablename__ = 'Tag'
id = db.Column(db.Integer, primary_key=True)
data_elements = db.relationship('DataElement', secondary=DataElementTag, back_populates='tags')
DataElementTag = db.Table('DataElementTag',
db.Column('id', db.Integer, primary_key=True),
db.Column('data_element_id', db.Integer, db.ForeignKey('DataElement.id')),
db.Column('tag_id', db.Integer, db.ForeignKey('Tag.id'))
)
ORM 巫师和 python 怪胎,我召唤你!
【问题讨论】:
-
能否添加相关的数据库模型或DDL?
-
@rfkortekaas 当然,我已经编辑了问题。
标签: python sql sqlalchemy orm flask-sqlalchemy