Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python sqlalchemy试图有效地计算数据库中的父项_Python_Sqlalchemy - Fatal编程技术网

Python sqlalchemy试图有效地计算数据库中的父项

Python sqlalchemy试图有效地计算数据库中的父项,python,sqlalchemy,Python,Sqlalchemy,下面的函数rank正确地计算了数据库中的父级,但我必须像Group.query(user\u id==1)那样发送它。rank(0,Group.query.(user\u id==1))似乎效率不高。有没有更好的方法来编写这个函数 class Group(db.Model): #data id=db.Column(db.Integer, primary_key=True) name=db.Column(db.String(32), nullable=False)

下面的函数rank正确地计算了数据库中的父级,但我必须像Group.query(user\u id==1)那样发送它。rank(0,Group.query.(user\u id==1))似乎效率不高。有没有更好的方法来编写这个函数

class Group(db.Model):
    #data
    id=db.Column(db.Integer, primary_key=True)
    name=db.Column(db.String(32), nullable=False)
    #relationships
    parent_id=db.Column(db.Integer, db.ForeignKey('group.id'))
    children=db.relationship('Group', backref=db.backref('parent', remote_side=[id]))

    def rank(self, count, parent):
        if parent.parent:
            count=count+1
            parent.rank(count, parent.parent)
        else:
            return count

将调用该方法的实例作为另一个参数传递是多余的,并且您的函数也缺少返回语句。更不用说执行两次相同的查询就可以开始了。您可以而且应该简单地使用
self
self.parent
。递归函数的基本情况是没有父函数时:

class Group(db.Model):

    def rank(self):
        if not self.parent:
            return 0

        else:
            # Python has no TCO, so no point in trying to
            # use an accumulator
            return 1 + self.parent.rank()
但是你是对的,如果你有深度嵌套的结构,这可能不会理想地执行,但是对于几个层次的嵌套来说,简单的递归可能会胜过更复杂的方法。对实例的
Group.parent
的每次首次访问都会向DB发出一条新的SELECT语句。您可以对数据执行该操作,或者换句话说,在数据库中执行该操作。树状结构可通过以下方式处理:


如果您需要count SQL端,您也可以将其交给a。

将调用该方法的实例作为另一个参数传递是多余的,并且您的函数也缺少返回语句。更不用说执行两次相同的查询就可以开始了。您可以而且应该简单地使用
self
self.parent
。递归函数的基本情况是没有父函数时:

class Group(db.Model):

    def rank(self):
        if not self.parent:
            return 0

        else:
            # Python has no TCO, so no point in trying to
            # use an accumulator
            return 1 + self.parent.rank()
但是你是对的,如果你有深度嵌套的结构,这可能不会理想地执行,但是对于几个层次的嵌套来说,简单的递归可能会胜过更复杂的方法。对实例的
Group.parent
的每次首次访问都会向DB发出一条新的SELECT语句。您可以对数据执行该操作,或者换句话说,在数据库中执行该操作。树状结构可通过以下方式处理:


如果需要计算SQL端,您也可以将其交给a。

换句话说,您是否正在尝试计算嵌套级别?你用的是什么数据库?另外,为什么要将与
parent
参数相同的实例传递给
rank()
,而不是使用
self
?我正在为数据库使用sqlite。我尝试使用self,但它始终返回0。我的想法是,如果你有5个父母,你的排名是5。因为数据库是自引用的,所以当一个新的表观被附加为根时,我需要这些表观能够改变。换句话说,你是在计算嵌套级别吗?你用的是什么数据库?另外,为什么要将与
parent
参数相同的实例传递给
rank()
,而不是使用
self
?我正在为数据库使用sqlite。我尝试使用self,但它始终返回0。我的想法是,如果你有5个父母,你的排名是5。因为数据库是自引用的,所以当一个新的表观作为根附加时,我需要这些表观能够更改。Strong是这个表观中的Python。Strong是这个表观中的Python。