2015-09-30 2 views
1

Я построил CRUD API для работы с database. Retrieve (или прочитано) function для таблицы class, assessment_results в настоящее время дает мне проблемы. Справочная информация относительно дизайна: API также имеет файл удобства, который наследуется от основного файла (object.py) для целей принятия значений string.Дополнительные позиционные аргументы Повышение ценностиError

Что ему нужно сделать: проверьте наличие ID и/или проверьте наличие двух аргументов (если идентификатор не используется). Если один или другой (и), если необходимо, извлеките его вместе со своими данными. Следуя docs on Python, я ввел аргумент *, чтобы разрешить необязательные аргументы позиции. Я также помог от этого великого tutorial. (Я новичок в проектировании и строительстве DBS и используя питон.)

Я считаю, что получить метод работает, но должно быть недостаток в конструкции или метод create_category_rating(...), как Traceback теперь возвращается ValueError. Я читаю здесь по адресу Stacks (аналогичная проблема), что мне может потребоваться присвоить значение args, но похоже, что я через API.

код следующим образом:

object.py

(метод извлечения и метод create_category_rating):

def retrieve_assessment_results(self, something_unique, *args): 
    if isinstance(something_unique, int): 
     return self.session.query(Assessment_Results).\ 
     filter(Assessment_Results.id == something_unique).one() 
    elif isinstance(something_unique, basestring) and isinstance(args, basestring): 
     return self.session.query(Assessment_Results).\ 
     filter(Assessment_Results.owner == something_unique).\ 
     filter(Assessment_Results.assessment == args).one() 
    elif isinstance(something_unique, Assessment_Results) and isinstance(args, Assessment_Results): 
     return something_unique, args 
    else: 
     raise ValueError('Value being passed is an object') 

def create_category_rating(self, category_rating_int, category, assessment_results): 
    new_catrating = Category_Rating(category_rating_int, category, assessment_results) 
    self.session.add(new_catrating) 
    print(new_catrating) 
    self.session.commit() 
    return(new_catrating) 

convenience.py (наследует от object.py)

def create_category_rating(self, category_rating_int, category_name, username, name): 
    category = self.retrieve_category(category_name) 
    owner = self.retrieve_user(username) 
    assessment = self.retrieve_assessment(name) 
    assessment_results = self.retrieve_assessment_results(owner, assessment) 
    return super(ConvenienceAPI, self).create_category_rating(category_rating_int, category, assessment_results) 

test.py

api = ConvenienceAPI() 
api.create_category_rating(2, 'Decision-Making', 'baseball', 'Becoming a Leader') 


Текущий выпуск: StatementError Согласно предложил, изменил условными (необходимо распаковать и назначить кортеж, данное * арг).

Новый API:

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 assessment is not None: 
     return self.session.query(Assessment_Results).\ 
     filter(Assessment_Results.assessment == assessment).one() 
    elif owner is not None: 
     return self.session.query(Assessment_Results).\ 
     filter(Assessment_Results.owner == owner).one() 

след вызовов TRACEBACK:

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 323, in retrieve_assessment_results 
    filter(Assessment_Results.assessment == assessment).one() 
    File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2472, in one 
    ret = list(self) 
    File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2515, in __iter__ 
    return self._execute_and_instances(context) 
    File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2530, in _execute_and_instances 
    result = conn.execute(querycontext.statement, self._params) 
    File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 914, in execute 
    return meth(self, multiparams, params) 
    File "/usr/local/lib/python2.7/site-packages/sqlalchemy/sql/elements.py", line 323, in _execute_on_connection 
    return connection._execute_clauseelement(self, multiparams, params) 
    File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1010, in _execute_clauseelement 
    compiled_sql, distilled_params 
    File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1078, in _execute_context 
    None, None) 
    File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1339, in _handle_dbapi_exception 
    exc_info 
    File "/usr/local/lib/python2.7/site-packages/sqlalchemy/util/compat.py", line 199, in raise_from_cause 
    reraise(type(exception), exception, tb=exc_tb) 
    File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1073, in _execute_context 
    context = constructor(dialect, self, conn, *args) 
    File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/default.py", line 544, in _init_compiled 
    grp, m in enumerate(parameters)] 
    File "/usr/local/lib/python2.7/site-packages/sqlalchemy/sql/compiler.py", line 498, in construct_params 
    pd[self.bind_names[bindparam]] = bindparam.effective_value 
    File "/usr/local/lib/python2.7/site-packages/sqlalchemy/sql/elements.py", line 1162, in effective_value 
    return self.callable() 
    File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/relationships.py", line 1386, in _go 
    value = fn(*arg, **kw) 
    File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/mapper.py", line 2422, in _get_state_attr_by_column 
    return state.manager[prop.key].impl.get(state, dict_, passive=passive) 
StatementError: (exceptions.KeyError) 'assessment_id' [SQL: u'SELECT assessment_results.id AS assessment_results_id, assessment_results.created_on AS assessment_results_created_on, assessment_results.owner_id AS assessment_results_owner_id, assessment_results.assessment_id AS assessment_results_assessment_id \nFROM assessment_results \nWHERE ? = assessment_results.assessment_id'] [parameters: [immutabledict({})]] 
+0

Я не понимаю, почему вы думаете, что это имеет какое-либо отношение к 'args'. Вы сказали, что ваша функция явно выражает эту ошибку, если она не распознает, что такое 'something_unique'. Поскольку это значение, в свою очередь, происходит от 'retrieve_user', вам, по крайней мере, потребуется опубликовать этот метод. –

+0

Нет, трассировка, которую вы опубликовали, ясно показывает, что ошибка происходит внутри 'retrieve_assessment', поэтому я не понимаю, как вы можете сказать, что она работает правильно. Это код, который вы должны размещать, извините. –

+0

Итак ... о чем он жалуется? Вставьте операторы печати вверху retrieve_assessment, чтобы просмотреть переданные аргументы. Аналогично скажите условия if. Это очень ** должно ** показать ошибку. – Prune

ответ

0

Я думаю, что, возможно, заметили проблему:

elif isinstance(something_unique, basestring) and isinstance(args, basestring): 

"арг" не basestring: вы необходимо проверить каждый отдельный аргумент, чтобы определить, является ли это basestring.

... and reduce(lambda x, y: x and isinstance(y, basestring), [a for a in args], True) 
+0

Мне нужно распаковать кортеж, чтобы заставить функцию работать. – thesayhey

Смежные вопросы