我一直收到一个Traceback抱怨系统找不到结果。考虑到对象实际上正在经历这种情况,情况就不应该是这样了(我知道这一点,因为我有一个print命令来确认正在进行的查询)。我相信这个问题是在create_category_rating(..)的方法中发现的。
当我使用.one()时,它会抛出下面的抱怨。当我使用.all时,它返回AttributeError: 'list' object has no attribute '_sa_instance_state' (其他人有这个问题)。文档 at SQLAlchemy很好地定义了这些方法,但是由于某种原因,我的代码崩溃了。
问题:如果对象正在通过检索方法,是什么导致程序中断?在某个地方有个bug,我一直在为压扁它而挣扎。
我使用的是SQLAlchemy和python2.7:
回溯:
ERROR: notssdb.test.test.test1
----------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/local/lib/python2.7/site-packages/nose/case.py", line 197, in runTest
self.test(*self.arg)
File "/Users/ack/code/venv/NotssDB/notssdb/test/test.py", line 111, in test1
api.create_category_rating(2, 'Decision-Making', 'baseball', 'Becoming a Leader')
File "/Users/ack/code/venv/NotssDB/notssdb/api/convenience.py", line 41, in create_category_rating
assessment_results = self.retrieve_assessment_results(owner, assessment)
File "/Users/ack/code/venv/NotssDB/notssdb/api/object.py", line 324, in retrieve_assessment_results
filter(Assessment_Results.owner == owner).one()
File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2478, in one
raise orm_exc.NoResultFound("No row was found for one()")
NoResultFound: No row was found for one()
# output from Traceback
Decision-Making
baseball
Becoming a Leader
Becoming a Leader
test1 <Assessment(name='Becoming a Leader', text='better decisions')>convenience.py (创建方法):
def create_category_rating(self, category_rating_int, category_name, username, name):
category = self.retrieve_category(category_name)
owner = self.retrieve_user(username) # added
assessment = self.retrieve_assessment(name) #added
assessment_results = self.retrieve_assessment_results(owner, assessment)
return super(ConvenienceAPI, self).create_category_rating(category_rating_int, category, assessment_results)object.py (检索方法):
def retrieve_assessment_results(self, *args):
id, assessment, owner = None, None, None
if len(args) == 1:
id, = args[0]
elif len(args) == 2:
assessment, owner = args
else:
raise ValueError('Value being passed is an object')
if id is not None:
return self.session.query(Assessment_Results).\
filter(Assessment_Results.id == id).one()
elif owner is not None:
print 'test1', owner
return self.session.query(Assessment_Results).\
filter(Assessment_Results.owner == owner).one()
elif assessment is not None:
print 'test2', assessment
return self.session.query(Assessment_Results).\
filter(Assessment_Results.assessment == assessment).one()发布于 2015-10-02 15:52:00
你有以下几点:
self.retrieve_assessment_results(owner, assessment)...but "retrieve_assessment_results“的参数如下(加上我的评论).
def retrieve_assessment_results(self, *args):
id, assessment, owner = None, None, None
if len(args) == 1:
id, = args[0]
elif len(args) == 2:
assessment, owner = args # Note this line!
else:
raise ValueError('Value being passed is an object')你通过业主,然后评估。但是,如果你检测到两个对象,你将读取评估,然后所有者。换句话说,您使用一个对象的顺序调用该方法,并假定相反的顺序进行检索。您甚至可以在调试行中看到这种情况:
print 'test1', owner你会期望这个打印出类似test1 <User(...)>的东西,但是它却打印出来了.
test1 <Assessment(name='Becoming a Leader', text='better decisions')>另外,考虑使用Python关键字参数来代替:
def retrieve_assessment_results(self, id=None, assessment=None, owner=None):
...然后你的电话就变得不那么模糊了:
self.retrieve_assessment_results(owner=owner, assessment=assessment)发布于 2015-10-02 14:30:12
如果结果集为空,one()将引发异常。使用first(),如果没有结果,您将得到第一个结果或Python None。
关于all()也是如此,因为这个问题不包含相关的跟踪和代码。
https://stackoverflow.com/questions/32909256
复制相似问题