Вставка в MySQL с помощью python через параметризованный запрос приводит к ошибке - PullRequest
1 голос
/ 29 апреля 2020

Во время вставки в MySQL 5.x через python 3.x я получаю сообщение об ошибке, причина которого не могу найти. Это простая вставка:

self.curr.execute(""" 
    INSERT IGNORE INTO test (
        `name`
    ) 
    VALUES (%s)

    """, (                 

        item['test']                    
    )
)

Приводит к этой ошибке:

Failed to save datasets. INSERT IGNORE INTO test (
                    `name`
) 
VALUES (%s) Error  1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%s)' at line 4

Все выглядит хорошо для меня, в чем проблема с этой вставкой?

1 Ответ

0 голосов
/ 30 апреля 2020

Python s DB-API , стандарт, для которого был разработан модуль вашей базы данных, указывает, что в качестве аргумента параметров для .execute() должна быть указана «последовательность или отображение».

Ваш аргумент был строкой, поэтому то, что было помещено в запрос, не было понято базой данных.

Требуется преобразовать второй (второй) аргумент в .execute() в последовательность, а обычная последовательность - это кортеж. Иногда людей удивляет, что кортеж не сформирован путем заключения значения в скобки / скобки, и что конечная запятая необходима. Обратите внимание, что если бы вы вставляли несколько значений, вы бы вообще не столкнулись с этой проблемой.

Итак, что нужно:

self.curr.execute(""" 
    INSERT IGNORE INTO test (
        `name`
    ) 
    VALUES (%s)

    """, (                 

        item['test'],
        #           ^ trailing comma!                   
    )
)

Существует по крайней мере один модуль базы данных, который позволяет только одно значение, которое будет использоваться (т.е. не последовательность) - в отступлении от спецификаций DB-API; что отбросило меня в прошлое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...