2013-05-03 39 views
4

我遇到了python SQLAlchemy單表繼承的問題。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: Instance is not bound to a Session; attribute refresh operation cannot proceed

我已驗證myUser是「PasswordUser」類型,並且它調用正確的「validatePassword」方法。

奇怪的是,當我慢慢地通過代碼(PyDev),它的工作原理沒有錯誤。

它也適用於我的userGet方法執行sess.query(PasswordUser)。但我想這個方法是通用的,所以它可以返回任何類型的'用戶'。

任何想法?

回答

3

問題是,當您僅查詢User,只有時,將從數據庫中查詢用戶(基)類的屬性/列。爲了加載子類的其他列(如password),您需要指示query這樣做。自動使用

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):您可以通過使用with_polymorphic做到這一點,在這種情況下,你的代碼可能看起來像會話,這就是爲什麼它抱怨它不能使用分離的對象。

+0

謝謝!奇蹟般有效! – user2347234 2013-05-06 13:48:39