Не все параметры были использованы в операторе SQL при выполнении executemany () - PullRequest
0 голосов
/ 10 февраля 2020

Я использую Python3 версию mysql -коннектора и пытаюсь использовать функцию executemany.

Мой код выглядит так:

database = mysql.connector.connect(
        host='localhost',
        user='user',
        password='test',
        database='test_database'
    )
cursor = database.cursor()
categories = ['Test1', 'Test 2']
stmt = "INSERT INTO categories (name) VALUES (%s)"
cursor.executemany(stmt, categories)

My Таблица содержит только один столбец, и это строковый столбец с именем name.

Я попытался использовать записи в списке в качестве кортежа, я изменил оператор вставки так:

stmt = "INSERT INTO categories (name) VALUES ('%s')"

Итак Я в основном добавил одинарные кавычки в заполнитель% s. Я также пытался заменить% s на? но это также не сработало.

Из-за соглашений о форматировании Python3 функция единственного исполнения работает, когда я использую это:

stmt = "INSERT INTO categories (name) VALUES ('{}')".format('Test1')

К сожалению, функции executemany нужен второй аргумент поэтому я не могу использовать функцию .format.

Это мой рабочий пример с обычной функцией исполнения:

database = mysql.connector.connect(
            host='localhost',
            user='user',
            password='test',
            database='test_database'
        )
cursor = database.cursor()
categories = ['Test1', 'Test2']
for category in categories:
    cursor.execute("INSERT INTO categories (name) VALUES ('{}')".format(category))

database.commit()

Редактировать:

Я прочитал официальная документация . Я скопировал и вставил код и изменил его на мои параметры, но он все еще не работает.

categories = [('Test1'),('Test2'),]
stmt = "INSERT INTO categories (name) VALUES (%s)"
cursor.executemany(stmt, categories)

Ответы [ 2 ]

0 голосов
/ 10 февраля 2020

Относительно решения этого вопроса stackoverflow Я нашел решение.

Утверждение было верным, но мой список данных был неверным. Если вы просто предоставляете одно значение, вам нужна запятая внутри кортежа.

Это окончательное решение:

categories = [('Test1',),('Test2',)]
stmt = "INSERT INTO categories (name) VALUES (%s)"
cursor.executemany(stmt, categories)

Это также задокументировано в документации MySQL.

0 голосов
/ 10 февраля 2020

Просто чтобы исключить основы:

Я вижу, что for l oop, который вы вставили в вопрос, заканчивается оператором database.commit(), а блок executemany - нет. Вы пропустили это в своем коде или просто в вопросе? (извините, я ставлю это в качестве ответа .. пока не могу добавлять комментарии)

...