这是我在sqlalchemy中使用的一些非常简单的代码,我在这里遗漏了一些关于类如何工作的基本信息。
class Game(Base):
__tablename__ = "games"
id = Column(Integer, primary_key=True)
a_name = Column(String)
def __init__(self, **kwargs):
for k, v in kwargs.iteritems():
setattr(self, k, v)
print 'hi'
self.away_dictionary = {'name': self.a_name}
@hybrid_property
def stuff(self):
return self.away_dictionary
以下查询有效:
session.query(Game).first().a_name
但以下查询返回错误:
session.query(Game).first().stuff
'Game' object has no attribute 'away_dictionary'
我还有一个更基本的问题,当我查询游戏类时,它不会打印出“嗨”。所以有人能解释一下为什么每次我使用一个游戏实例时都不打印“hi”吗?第二个问题是,我如何为这个类的每个实例构建和访问我想要的away_字典?
您没有在上面的查询中创建游戏实例,只传递游戏类对象。因此,init构造函数永远不会被调用。 如果您需要一个游戏实例进行查询,则需要这个:
session.query(Game()).first().stuff
。啊哈。我正要指出,奇怪的是
stuff
没有找到,我希望away_dictionary
没有找到。。。你编辑了你的文章并修改了你引用的错误信息。确实是away_dictionary
没有找到,因为它通常是在类的__init__()
方法中创建的,并且__init__()
没有被调用。通常,在创建实例时会调用
__init__()
,但是在SQLAlchemy的查询中使用该类时,它会跳过__init__()
方法。我怀疑这与SQLAlchemy的declarative_mapper
工作原理有关,但我对SQLAlchemy的了解还不够,根本不知道如何修复它。如果我发现了,我稍后会编辑这个答案并告诉你。但现在,您可能不应该依赖于在SQLAlchemy模型对象中调用的
__init__()
方法(也就是从Base
派生的任何东西)。看看你能不能用其他方式来构造你的代码。谢谢你的评论。只是我还是sqlalchemy有点让人困惑?
不管怎样,正如人们在上面指出的,
__init__
方法显然在执行查询时不被调用。解决方法是添加以下代码:
这个函数将像一个真正的
__init__
函数,并在创建对象时被调用!!相关问题 更多 >
编程相关推荐