簡體   English   中英

SQLAlchemy與單表繼承刪除錯誤

[英]SQLAlchemy with single table inheritance expunge error

我遇到了python SQLAlchemy單表繼承的問題。

模型:

class User(Base):
    __tablename__ = 'user'
    userID = Column(String(64), primary_key=True)
    name = Column(String(64))
    type = Column('type', String(50))
    __mapper_args__ = {'polymorphic_on': type}

class PasswordUser(User):
    __mapper_args__ = {'polymorphic_identity': 'puser'}
    password = Column(String(64))

    def validatePassword(self, password):
        return (self.password == password)

在userManger.py我有這個:

def userGet(userID):
    with DBStore.Session(db) as sess:
        user = sess.query(User).filter(User.userID==userID).one()
        sess.expunge(user)
    return user

在測試主要方法中:

myUser = userManager.userGet('123')
myUser.validatePassword("password321')

這會產生錯誤:

sqlalchemy.orm.exc.DetachedInstanceError:實例未綁定到Session; 屬性刷新操作無法繼續

我已經驗證myUser是'PasswordUser'類型,它調用了正確的'validatePassword'方法。

更奇怪的是,當我慢慢地逐步執行代碼(PyDev)時,它可以正常工作。

如果我的userGet方法執行sess.query(PasswordUser),它也可以工作。 但我希望這種方法是通用的,因此它可以返回任何類型的“用戶”。

有任何想法嗎?

問題是,當您僅查詢User從數據庫中查詢User(base)類的屬性/列。 為了加載子類的其他列(如password ),您需要指示query這樣做。 您可以使用with_polymorphic來執行此with_polymorphic ,在這種情況下,您的代碼可能如下所示:

def userGet(userID):
    with DBStore.Session(db) as sess:
        user = sess.query(User).with_polymorphic('*').filter(User.userID==userID).one()
        sess.expunge(user)
    return user

如果你不這樣做,sqlalchemy將嘗試使用會話自動加載缺少的屬性(在你的情況下, password ),這就是為什么它抱怨它不能用於分離對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM