SqlAlchemy查询选择没有子元素的行

Han*_*han 1 sqlalchemy

我有一个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
Run Code Online (Sandbox Code Playgroud)

这是我对查询的最佳尝试:

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()
Run Code Online (Sandbox Code Playgroud)

这给了我错误:

sqlalchemy.exc.ProgrammingError:(pymysql.err.ProgrammingError)(1111,u'Invalid使用组功能'的)[SQL:u'SELECT tags.id AS tags_id,tags.name AS tags_name,tags.subject_id AS tags_subject_id,标签.parent_tag_id AS tags_parent_tag_id \n从标签INNER JOIN AS tags_1 ON tags.id = tags_1.parent_tag_id标签\nWHERE计数(tags.id = tags.parent_tag_id)=%(COUNT_1)S和tags.subject_id IS NOT NULL ORDER BY tags.name '] [参数:{u'count_1':0}]

非常感谢您的帮助.

A. *_*dor 6

一般来说: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()
Run Code Online (Sandbox Code Playgroud)

  • 我也向您推荐这个 [替代解决方案](http://stackoverflow.com/a/23814865/5869747),在这种情况下,您可以尝试:`.filter(~Tag.children.any())`。 (4认同)