WedX - журнал о программировании и компьютерных науках

42000 Ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашему серверу MySQL

У меня проблемы с кодом 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), не получив освобождения от своей ошибки.

31.07.2013

  • каково содержимое переменной i? Как он инициализируется? 31.07.2013
  • Ой, извините, я забыл это написать. У меня есть первоначальный список под названием theList, который содержит все соответствующие номера социального страхования, SSN, которые я затем просматриваю следующим образом: for i in theList: и именно в этом цикле блок кода: 31.07.2013
  • temp=process_query(ВЫБЕРИТЕ 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) является. 31.07.2013
  • Не могли бы вы соответствующим образом отредактировать исходный код в своем вопросе? Это будет намного читабельнее, чем в комментариях. 31.07.2013
  • Пожалуйста, обновите вопрос с некоторыми примерами данных для theList 01.08.2013

Ответы:


1

Используйте параметры запроса в cursor.execute() вызове вашей process_query функции. Это решит любые проблемы с экранированием (защита вашего кода от SQL-инъекций) и продвигает подготовка выписки.

Измените функцию process_query, чтобы она принимала два параметра: один для строки SQL (содержащей заполнитель значения параметра) и один для значений параметров:

def process_query(sql, params):
    cursor1.execute(sql, params)

Затем цикл for изменится на:

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)
    temp.append(known_hours)
    unknown_hours=process_query('SELECT Distinct COUNT(*) FROM Works_On WHERE ISNULL(Hours) AND ESSN=?', i)
    temp.append(unknown_hours)

Если это не решит проблему с синтаксисом, обновите свой вопрос, указав строку запроса, вызывающую проблему.

31.07.2013
  • Спасибо за ваш ответ! Это, конечно, убрало несколько ошибок! Однако я столкнулся с новым, который был отредактирован в моем исходном сообщении. Но спасибо еще раз! Очень ценил это. 01.08.2013
  • Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

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

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]