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