我有一个Tag
表,可以有同一类的父Tag
。
我想要一个查询来返回没有任何子节点的所有Tag
个实例。
以下是SqlAlchemy类的代码:
class Tag(db.Model):
__tablename__ = 'tags'
id = db.Column(db.String(32), primary_key=True)
name = db.Column(db.String(45),nullable=False)
subject_id = db.Column(db.Integer, db.ForeignKey('subjects.id'), nullable=False)
parent_tag_id = db.Column(db.Integer, db.ForeignKey('tags.id'), nullable=True)
subject = db.relationship('Subject', backref=db.backref('tags', lazy='dynamic'))
parent_tag = db.relationship('Tag',
remote_side=[id],
backref=db.backref('children', lazy='dynamic'))
def __init__(self, name, subject_id, parent_tag_id=None):
self.id = uuid.uuid4().hex
self.name = name
self.subject_id = subject_id
self.parent_tag_id = parent_tag_id
这是我对查询的最佳尝试:
def get_all_subject_tags_ordered():
_child_tag = aliased(Tag)
return db.session.query(Tag)\
.join(_child_tag, Tag.children)\
.filter(func.count(Tag.children) == 0)\
.filter(Tag.subject_id.isnot(None))\
.order_by(Tag.name)\
.all()
这给了我错误:
sqlalchemy.exc.ProgrammingError:(pymysql.err.ProgrammingError)(1111, u'无效使用组函数')[SQL:u'SELECT tags.id AS tags_id, tags.name AS tags_name,tags.subject_id AS tags_subject_id, tags.parent_tag_id AS tags_parent_tag_id \ nFROM标签INNER JOIN标签 AS tags_1 ON tags.id = tags_1.parent_tag_id \ nWHERE count(tags.id = tags.parent_tag_id)=%(count_1)s AND tags.subject_id IS NOT NULL ORDER BY tags.name'] [参数:{u'count_1':0}]
非常感谢你的帮助。
答案 0 :(得分:5)
一般情况下:db.session.query(Parent).filter(Parent.children==None)
会找到没有Parent
的所有children
。
所以试试:
return db.session.query(Tag)\
.filter(Tag.children == None, Tag.subject_id != None)\
.order_by(Tag.name)\
.all()