我越来越:
sqlalchemy.exc.InvalidRequestError: Object '<DBEdge at 0x103c4a190>' is already attached to session '1' (this is '2')
Run Code Online (Sandbox Code Playgroud)
在这一行
session.add(edge)
Run Code Online (Sandbox Code Playgroud)
当我试图运行这个时:
def findOrCreateEdge(self,user1,user2): #user1 is followed by user2
if user1.id>user2.id:
user1, user2 = user2, user1
kind = 2
else:
kind = 1
edge = self.findEdge(user1,user2)
if edge:
if edge.kind==1 and kind==2:
edge.kind = 3
if edge.kind==2 and kind==1:
edge.kind = 3
return edge
else:
edge = DBEdge(user1,user2)
edge.kind = kind
user1.edge_count = user1.edge_count + 1
user2.edge_count = user2.edge_count + 1
#session.save(edge) # we don't flush edges here, because it gives us a huge speedup to do a bunch at once then flush.
try:
session.add(edge)
session.commit()
except:
session = Session()
session.add(edge)
session.commit()
return edge
Run Code Online (Sandbox Code Playgroud)
问题在于将边缘添加两次,一次添加到第一个会话,然后在例外情况下添加到第二个会话。我不知道你到底想在这里实现什么,但与其残酷地将边缘塞进新会话中,不如调查错误并解决问题会更好。或者,您可能想要回滚之前的会话并重新启动它,然后向其中添加边缘。
当您已经有一个会话时创建一个新会话几乎总是一个错误(除非上下文本身发生更改,但这里似乎不是这种情况)。