Ошибка в цикле. ('SQL содержит 1 маркер параметра, но было предоставлено 4 параметра', 'HY000')

У меня проблема с петлей. У меня есть следующий цикл:

for i in theList:

    temp=process_query('SELECT FName, LName FROM Employee WHERE SSN=?', i)
    known_hours=process_query('SELECT DISTINCT SUM(Coalesce(Hours,0)) FROM Works_On WHERE ESSN=?',(i))

где theList определяется как:

theList=process_query('SELECT DISTINCT SSN FROM Employee', None)

Теперь это работает без ошибок, наконец, благодаря Beargle. Однако я обнаружил еще одну проблему, которую не могу исправить, а именно то, что когда я вызываю функцию process_query ниже:

def process_query(query, parameters):    
    if(parameters is None):    
        cursor1.execute(query)
    else:
        cursor1.execute(query, parameters)    (*LINE 33)

    n=0
    lista = []

    while 1:
        row = cursor1.fetchone()    
        if not row:
            break
        lista.append(row[0])
        n = n+1
    return lista    

Проблема теперь в том, что программа жалуется на второй cursor1.execute (отмеченный звездочкой *), что («SQL содержит 1 маркер параметра, но было предоставлено 4 параметра», «HY000»), что, как я полагаю, проистекает из этого i - это номер социального страхования и, следовательно, не является однозначным целым числом, но я не могу понять, как решить эту проблему.

edit: Вот весь цикл со всей печатью:

цикл (и некоторые определения)

theList=process_query('SELECT DISTINCT SSN FROM Employee', None)    
temp=[]

for i in theList:
    temp=process_query('SELECT FName, LName FROM Employee WHERE SSN= ?', (i))   (LINE 71)    
    known_hours=process_query('SELECT DISTINCT SUM(Coalesce(Hours,0)) FROM Works_On WHERE ESSN=?',(i))    
    temp.append(known_hours)    
    unknown_hours=process_query('SELECT Distinct COUNT(*) FROM Works_On WHERE ISNULL(Hours) AND ESSN=?', (i))    
    unknown_hours=map(int,unknown_hours)    
    temp.append(unknown_hours)    
    if(unknown_hours > 0):    
        temp.append('Yes')    
    else:    
        temp.append('No')    
    theList.append(temp)        
print theList

который дает следующую печать (ПРИМЕЧАНИЕ! Я также обновил process_query, чтобы он распечатал запрос и параметры (в этом порядке).

SELECT DISTINCT SSN FROM Employee

None
SELECT FName, LName FROM Employee WHERE SSN= ?

123456789

SELECT DISTINCT SUM(Coalesce(Hours,0)) FROM Works_On WHERE ESSN=?

123456789

SELECT Distinct COUNT(*) FROM Works_On WHERE ISNULL(Hours) AND ESSN=?

123456789

SELECT FName, LName FROM Employee WHERE SSN= ?

333445555

SELECT DISTINCT SUM(Coalesce(Hours,0)) FROM Works_On WHERE ESSN=?

333445555

SELECT Distinct COUNT(*) FROM Works_On WHERE ISNULL(Hours) AND ESSN=?

333445555

SELECT FName, LName FROM Employee WHERE SSN= ?

453453453

SELECT DISTINCT SUM(Coalesce(Hours,0)) FROM Works_On WHERE ESSN=?

453453453

SELECT Distinct COUNT(*) FROM Works_On WHERE ISNULL(Hours) AND ESSN=?

453453453

SELECT FName, LName FROM Employee WHERE SSN= ?

666884444

SELECT DISTINCT SUM(Coalesce(Hours,0)) FROM Works_On WHERE ESSN=?

666884444

SELECT Distinct COUNT(*) FROM Works_On WHERE ISNULL(Hours) AND ESSN=?

666884444

SELECT FName, LName FROM Employee WHERE SSN= ?

888665555

SELECT DISTINCT SUM(Coalesce(Hours,0)) FROM Works_On WHERE ESSN=?

888665555

SELECT Distinct COUNT(*) FROM Works_On WHERE ISNULL(Hours) AND ESSN=?

888665555

SELECT FName, LName FROM Employee WHERE SSN= ?

987654321

SELECT DISTINCT SUM(Coalesce(Hours,0)) FROM Works_On WHERE ESSN=?

987654321

SELECT Distinct COUNT(*) FROM Works_On WHERE ISNULL(Hours) AND ESSN=?

987654321

SELECT FName, LName FROM Employee WHERE SSN= ?

987987987

SELECT DISTINCT SUM(Coalesce(Hours,0)) FROM Works_On WHERE ESSN=?

987987987

SELECT Distinct COUNT(*) FROM Works_On WHERE ISNULL(Hours) AND ESSN=?

987987987

SELECT FName, LName FROM Employee WHERE SSN= ?

999887777

SELECT DISTINCT SUM(Coalesce(Hours,0)) FROM Works_On WHERE ESSN=?

999887777

SELECT Distinct COUNT(*) FROM Works_On WHERE ISNULL(Hours) AND ESSN=?

999887777

SELECT FName, LName FROM Employee WHERE SSN= ?

['John', [Decimal('40.0')], [0], 'Yes']

Traceback (most recent call last):
  File "sumrpt2.py", line 72, in <module>
    temp=process_query('SELECT FName, LName FROM Employee WHERE SSN= ?', (i))
  File "sumrpt2.py", line 35, in process_query
    cursor1.execute(query, parameters)
pyodbc.ProgrammingError: ('The SQL contains 1 parameter markers, but 4 parameters were supplied', 'HY000')

У кого-нибудь есть подсказка?

С уважением, Cenderze


person Cenderze    schedule 06.08.2013    source источник
comment
Что означает (*) в функции process_query? Добавьте print query, parameters в первую строку функции process_query и обновите свой вопрос полным выводом.   -  person Bryan    schedule 06.08.2013
comment
@beargle Большое спасибо за ответ! Я добавил эти отпечатки сейчас, а также полный результат. Звездочка в process_query - это просто то место, где компилятор жалуется на ошибку, что более ясно видно в редактировании, которое я сделал именно сейчас.   -  person Cenderze    schedule 08.08.2013
comment
theList должен содержать только SSN, но как-то добавляется `['John', [Decimal ('40 .0 ')], [0],' Yes ​​']`. Убедитесь, что ваш источник данных возвращает только действительные SSN.   -  person Bryan    schedule 08.08.2013
comment
Раздел n=0 ... return lista функции process_query можно заменить на return cursor1.fetchall(). Вам не нужно вручную создавать список, когда cursor.fetchall () делает это за вас.   -  person Bryan    schedule 08.08.2013


Ответы (2)


Я бы предположил, что параметры ожидают список и перебирают число.

Пытаться:

temp=process_query('SELECT FName, LName FROM Employee WHERE SSN= ?', [i])

Пропустить список.

person Jim    schedule 06.08.2013
comment
Спасибо за ответы! Это очищает мои предыдущие ошибки, но вместо этого дает мне: «Список типов Python не поддерживается. param = 1 ',' HY097 ', который я не могу понять, если погуглить. Получили ли вы это раньше или знаете, как обрабатывать эти ошибки? - person Cenderze; 06.08.2013
comment
@GustavDanell Пытаюсь использовать (i) в этом случае. - person Jim; 06.08.2013
comment
Спасибо за ответ! Это устраняет мою предыдущую ошибку, но дает исходную ошибку: («SQL содержит 1 маркер параметра, но было предоставлено 4 параметра», «HY000») Странно, я думаю. Ты хоть представляешь, что это могло быть тогда? - person Cenderze; 06.08.2013
comment
@GustavDanell Что вы получите, если распечатаете i? - person Jim; 06.08.2013
comment
Если я распечатаю временный список temp в конце цикла, я получу: ['John', [Decimal ('40 .0 ')], [0],' Yes ​​'] [' Franklin ', [Decimal ('40 .0 ')], [0],' Да '] [' Джойс ', [Десятичное ('40,0')], [0], 'Да'] ['Рамеш', [Десятичное ('40,0 ')], [0 ], 'Да'] ['Джеймс', [Десятичное ('0.0')], [1], 'Да'] ['Дженнифер', [Десятичное ('35 .0 ')], [0],' Да '] ['Ahmad', [Decimal ('40 .0 ')], [0],' Yes ​​'] [' Alicia ', [Decimal ('40 .0')], [0], 'Yes'] (я пропустил некоторые запросы из моего вопроса), и когда я использую: theList.append (temp) внутри цикла, я не получаю вывода за исключением всех ошибок, если я печатаю theList вне цикла. - person Cenderze; 06.08.2013
comment
О, и если я напечатаю i, это будет их номер социального страхования, которым он должен быть, и если я распечатаю список вне цикла, будет напечатана первая строка (с Джоном и т. Д.). - person Cenderze; 06.08.2013
comment
@GustavDanell Похоже, проблема связана с запросом known_hours. Можете ли вы отредактировать вопрос, чтобы показать всю строку? - person Jim; 06.08.2013
comment
О, разве это не пришло? Я редактировал это сейчас. Вы хотите, чтобы я отредактировал весь цикл? Я просто подумал, что это какая-то синтаксическая ошибка, поэтому пропустил код, чтобы было легче увидеть. - person Cenderze; 06.08.2013
comment
@GustavDanell В этом случае я не понимаю. Единственное, что могло вызвать это, что я мог видеть, это если i было чем-то вроде ['John', [Decimal('40.0')], [0], 'Yes']. Надеюсь, кто-то еще может помочь! - person Jim; 06.08.2013
comment
Да, это действительно странно и для меня. Спасибо за ваши добрые усилия! - person Cenderze; 06.08.2013

Благодаря комментарию Бергла я наконец смог понять, в чем проблема!

Я знаю, что довольно сложно найти эти ответы в Google, если у вас возникнут проблемы, поэтому я подумал, что могу кратко описать, почему возникла эта ошибка:

В комментариях к этому сообщению было предложено несколько разных подходов к вызову функции, которая, я считаю, должна работать.

Однако, когда я перебрал «i» в списке и фактически добавил к нему в своем цикле, я получил ошибку «SQL содержит 1 маркер параметра, но было предоставлено 4 параметра», «HY000» ».

Это, как я полагаю, связано с тем, что в моих запросах мне нужен только один SSN, но поскольку я добавил в список, он перебирает разные столбцы, а также дает мне больше маркеров, чем требуется (следовательно, предоставлено 4 параметра, где требуется только 1 маркер параметра).

Надеюсь, это поможет кому-то, кто так же застрял, как и я.

Еще раз спасибо, Beargle и всем, кто нашел время, чтобы помочь мне!

С уважением,

person Cenderze    schedule 12.08.2013