4

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

テストの main メソッドでは:

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

これによりエラーが発生します。

sqlalchemy.orm.exc.DetachedInstanceError: インスタンスがセッションにバインドされていません。属性の更新操作を続行できません

myUser のタイプが「PasswordUser」であることを確認し、正しい「validatePassword」メソッドを呼び出します。

奇妙なことに、コードをゆっくりとステップ実行すると (PyDev)、エラーなしで動作します。

私の userGet メソッドが sess.query(PasswordUser) を実行する場合にも機能します。しかし、このメソッドをジェネリックにして、任意のタイプの「ユーザー」を返すことができるようにしたいと考えています。

何か案は?

4

1 に答える 1