У меня проблемы с кодом Python odbc. У меня не работает следующий код:
temp=process_query("SELECT FName, LName FROM Employee WHERE SSN='%s'" %i)
known_hours=process_query("SELECT DISTINCT Coalesce(Hours,0)
FROM Works_On WHERE ESSN='%s'" %i)
temp.append(known_hours)
где process_query принимает форму:
def process_query(query):
cursor1.execute(str(query))
(process_query продолжается еще немного, но это просто для целей печати, когда я искал в Интернете свою проблему, кажется, что проблема заключается в том, как я вызываю функцию выполнения, поэтому я пропустил здесь остальную часть функции).
Ошибка, которую я получаю, когда пытаюсь выполнить эту программу:
pyodbc.ProgrammingError: ('42000', "[42000] [MySQL][Драйвер ODBC 5.1][mysqld-5.1.66-0+squeeze1-log] У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашему Версия сервера MySQL для правильного синтаксиса для использования рядом с 'John', [Decimal('32.5'), Decimal('7.5')], 'Yes']'' в строке 1 (1064) (SQLExecDirectW)")
PS. Если кто-то знает, как опустить «десятичное число», когда я печатаю, и вместо этого просто иметь, например, 32,5, это также будет полезно для получения помощи.
Также я знаю, что по этому поводу было несколько тем, но мне еще предстоит увидеть и понять проблему, с которой я столкнулся для оператора select.
Редактировать
Что касается того, как реализовано «i», это выглядит следующим образом:
У меня есть первоначальный список под названием theList, который содержит все соответствующие номера социального страхования, SSN, которые я затем «зацикливаю» следующим образом:
for i in theList:
temp=process_query("SELECT FName, LName FROM Employee WHERE SSN='%s'" %i)
known_hours=process_query("SELECT DISTINCT SUM(Coalesce(Hours,0)) FROM Works_On WHERE ESSN='%s'" %i)
temp.append(known_hours)
unknown_hours=process_query("SELECT Distinct COUNT(*) FROM Works_On WHERE ISNULL(Hours) AND ESSN='%s'" %i)
temp.append(unknown_hours)
Редактировать
Я изменил его, как предложил Beargle. Однако теперь я сталкиваюсь с другой ошибкой, а именно с тем, что, поскольку я перебираю i (номера социального страхования) в списке, я должен определить их раньше.
Поэтому я использую строку
theList=process_query('SELECT DISTINCT SSN FROM Employee', None)
Где я обновил свой process_query до:
def process_query(query, parameters):
if(parameters is None):
cursor1.execute(query)
else:
cursor1.execute(query, parameters) (*)
n=0
lista = []
while 1:
row = cursor1.fetchone()
if not row:
break
lista.append(row[0])
n = n+1
if n==0:
print "No tuples matching the given query were found."
return lista
Теперь проблема в том, что программа жалуется на второй cursor1.execute (отмеченный звездочкой, *), что («SQL содержит 1 маркер параметра, но было предоставлено 4 параметра», «HY000»), что, как я полагаю, связано с тем, что я является номером социального обеспечения и, следовательно, не является целым числом из одной цифры, но я не могу понять, как решить эту проблему.
Теперь я называю свой как:
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)
i в списке идентифицируется перед циклом, определяющим temp, и, например, следующим образом:
theList=process_query('SELECT DISTINCT SSN FROM Employee', None)
который удалил все другие ошибки, но дал мне новую, как указано ранее. Кроме того, я попытался преобразовать «i» в int (i) и map (int, i), не получив освобождения от своей ошибки.