Python SQLAlchemy错误:实例未绑定到会话;属性刷新操作无法继续

时间:2018-03-08 23:17:12

标签: python orm sqlalchemy flask-sqlalchemy

我有以下SQLAlchemy模型:

class MyObject2(db.Model, Timestamp):
    id = db.Column(UUIDType(binary=False), nullable=False, primary_key=True) 
    myobj1_id = db.Column(UUIDType(binary=False), db.ForeignKey(MyObject1.id), nullable=False) 
    name = db.Column(db.String(25))

    def __init__(self, myobj1_id, name=None): 
        self.id = uuid.uuid4() 
        self.myobj1_id = myobj1_id
        self.name = name

    @classmethod
    def create(cls, myobj1, name=None):
        try:
            myobj2 = cls(myobj1_id=myobj1.id, name=name)
            db.session.add(myobj2)
            db.session.commit()
            print myobj2     #<=========== LOOK AT THIS LINE!
            return myobj2
        except Exception:
            db.session.rollback()
            raise
        finally:
            db.session.close()

请注意,那里有一个无关的打印声明。 看到?它没有真正做任何事情。哦,好吧。

现在,这是调用create()方法来创建模型实例的代码:

myobj2 = MyObject2.create(myobj1=myobj1, name='Hello') 
serialized_myobj_2 = MyObject2Serializer(myobj2).data

这一切都很好。但是一旦我删除了不必要的print语句,我就会在调用者的最后一行收到以下错误:

Instance <MyObject2 at 0x7ff804ac5710> is not bound to a Session; attribute refresh operation cannot proceed

为什么呢?如何缺少print语句会导致此错误? 当我搜索此错误时,我找到了this post。但是那里给出的解决方案 - 调用session.expunge_all() right before session.close()` - 对我来说不起作用。

在不破坏我的代码的情况下摆脱那个print语句的解决方案是什么?

0 个答案:

没有答案