2013-09-12 5 views
0

Я получаю сообщение об ошибке TypeError: 'str' object is not callable, когда INSERT INTO database.exceptions.TypeError: объект 'str' не может быть вызван

Я использую: Python 2.7.5, Scrapy 0.18 и MySQL базы данных

Мой Traceback является:

Traceback (most recent call last): 
     File "C:\python27\lib\threading.py", line 781, in __bootstrap 
     self.__bootstrap_inner() 
     File "C:\python27\lib\threading.py", line 808, in __bootstrap_inner 
     self.run() 
     File "C:\python27\lib\threading.py", line 761, in run self.__target(*self.__args, **self.__kwargs) 
    --- <exception caught here> --- 
     File "C:\python27\lib\site-packages\twisted\python\threadpool.py", line 191, in _worker 
     result = context.call(ctx, function, *args, **kwargs) 
     File "C:\python27\lib\site-packages\twisted\python\context.py", line 118, in callWithContext 
     return self.currentContext().callWithContext(ctx, func, *args, **kw) 
     File "C:\python27\lib\site-packages\twisted\python\context.py", line 81, in callWithContext 
     return func(*args,**kw) 
     File "C:\python27\lib\site-packages\twisted\enterprise\adbapi.py", line 448, in _runInteraction 
     result = interaction(trans, *args, **kw) 

     File "apple\pipelines.py", line 49, in _conditional_insert 

     'INSERT INTO job (id, company, day, hour, job, car1, car2) values (%s, %s, %s, %s, %s, %s)' ("company, day, hour, job, car1, car2 ") 

exceptions.TypeError: 'str' object is not callable 

Это мой код сценария:

def _conditional_insert(self, tx, item): 
    # create record if doesn't exist. 
    # all this block run on it's own thread 
    tx.execute('select * from job where hour = %s', ("item['hour'], ")) 
    result = tx.fetchone() 
    if result: 
     log.msg("Item already stored in db: %s" % item, level=log.DEBUG) 
    else: 
     tx.execute(\ 
      'INSERT INTO job (id, company, day, hour, job, car1, car2) values (%s, %s, %s, %s, %s, %s)' ("company, day, hour, job, car1, car2 ") 
     ) 
     log.msg("Item stored in db: %s" % item, level=log.DEBUG) 

def handle_error(self, e): 
    log.err(e) 

Любая идея, что я может справиться с этой ошибкой?

ответ

1

Вам не хватает % в следующей строке. Кроме того, я предполагаю, что значение получено из аргумента item.

'INSERT INTO job (id, company, day, hour, job, car1, car2) values (%s, %s, %s, %s, %s, %s)' ("company, day, hour, job, car1, car2 ") 

Должно быть

'INSERT INTO job (id, company, day, hour, job, car1, car2) values (%s, %s, %s, %s, %s, %s)' % (item['company'], item['day'], item['hour'], item['job'], item['car1'], item['car2']) 

Вы также можете использовать метод format из строки:

'INSERT INTO job (id, company, day, hour, job, car1, car2) values ({company}, {day}, {hour}, {job}, {car1}, {car2})'.format(**item) 

Кстати, следующая строка, вероятно, не делать то, что вы ожидаете:

tx.execute('select * from job where hour = %s', ("item['hour'], ")) 

его следует читать

tx.execute('select * from job where hour = %s' % item['hour']) 
+0

спасибо за вашу помощь я получаю другую ошибку: exceptions.TypeError: недостаточно аргументов для строки формата. Кто-то может сказать мне, как я могу решить? Где я должен добавить круглые скобки? – Floriano

+0

См. мой обновленный ответ. Возможно, вы захотите освежить [форматирование строки] (http: // docs. python.org/release/2.5.2/lib/typesseq-strings.html) – Rod

+0

Еще раз спасибо за вашу помощь. Еще одна ошибка, но я не знаю, t знать решимость. Идея для моей помощи. Заранее спасибо. _mysql_exceptions.ProgrammingError: (1064, «У вас есть ошибка в синтаксисе SQL, проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с« [u'TT »] в строке 1») – Floriano

0

Я думаю, что намерение OP состояло в том, чтобы использовать заполнители и параметры в качестве кортежа.

Код должен выглядеть так:

def _conditional_insert(self, tx, item): 
    # create record if doesn't exist. 
    # all this block run on it's own thread 
    tx.execute('select * from job where hour = %s', (item["hour"],)) 
    result = tx.fetchone() 
    if result: 
     log.msg("Item already stored in db: %s" % item, level=log.DEBUG) 
    else: 
     tx.execute(
      'INSERT INTO job (company, day, hour, job, car1, car2) values (%s, %s, %s, %s, %s, %s)', 
      (item["company"], item["day"], item["hour"], item["job"], item["car1"], item["car2"]) 
     ) 
     log.msg("Item stored in db: %s" % item, level=log.DEBUG) 

def handle_error(self, e): 
    log.err(e) 

Я удалил id колонки в 'INSERT INTO работы (ID, компания, ...'

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