[英]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.