У меня проблема с петлей. У меня есть следующий цикл:
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
print query, parameters
в первую строку функцииprocess_query
и обновите свой вопрос полным выводом. - person Bryan   schedule 06.08.2013theList
должен содержать только SSN, но как-то добавляется `['John', [Decimal ('40 .0 ')], [0],' Yes ']`. Убедитесь, что ваш источник данных возвращает только действительные SSN. - person Bryan   schedule 08.08.2013n=0 ... return lista
функцииprocess_query
можно заменить наreturn cursor1.fetchall()
. Вам не нужно вручную создавать список, когда cursor.fetchall () делает это за вас. - person Bryan   schedule 08.08.2013