gpt4 book ai didi

python - 具有单表继承删除错误的 SQLAlchemy

转载 作者:太空宇宙 更新时间:2023-11-03 11:07:02 24 4
gpt4 key购买 nike

我在使用 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: Instance is not bound to a Session; attribute refresh operation cannot proceed

我已验证 myUser 的类型为“PasswordUser”,并且它调用了正确的“validatePassword”方法。

奇怪的是,当我缓慢地逐步执行代码 (PyDev) 时,它可以正常运行。

如果我的 userGet 方法执行 sess.query(PasswordUser),它也有效。但我希望此方法是通用的,以便它可以返回任何类型的“用户”。

有什么想法吗?

最佳答案

问题是,当您仅查询 User 时, User(基)类的属性/列会从数据库中查询。为了加载子类的其他列(如 password),您需要指示 query 这样做。您可以使用 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 将尝试使用 session 自动加载缺少的属性(在你的情况下,password),这就是为什么它提示它无法使用分离的原因对象。

关于python - 具有单表继承删除错误的 SQLAlchemy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16361538/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com