Я использую Connector/Python для вставки многих строк в таблицу temp в mysql. Строки находятся в списке списков. Я выполнить вставку, как это:Почему оптимизаторы встраивания коннектора/Python не выполняются?
cursor = connection.cursor();
batch = [[1, 'foo', 'bar'],[2, 'xyz', 'baz']]
cursor.executemany('INSERT INTO temp VALUES(?, ?, ?)', batch)
connection.commit()
я заметил, что (со многими более строками, конечно) производительность была крайне бедна. Используя SHOW PROCESSLIST, я заметил, что каждая вставка выполнялась отдельно. Но в документации https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-executemany.html говорится, что это должно быть оптимизировано на 1 вставку. Что происходит?
https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-execute.html «Этот метод выполняет задание базы данных (запрос или команду). Параметры, найденные в Параметры кортежа или словаря привязаны к переменным в операции. Укажите переменные с использованием стиля параметра% s или% (name) s (то есть с использованием формата или стиля pyformat). execute() возвращает итератор, если multi - True. " Здесь нет ? заполнитель в курсор api вообще. – pvg
И все же это заявление работает на 100% штрафом с '?'. Я использовал это, потому что другие разработчики использовали его в существующем коде. Причудливо, что он работает *. – blueimpb
Api сам поддерживает различные заполнители и, возможно, некоторые общие функции где-то их ловят? В любом случае, вы действительно можете запросить сама реализация для владельца места https://www.python.org/dev/peps/pep-0249/#paramstyle. В случае соединителя mysql вы всегда должны использовать% s или названный Титулы. – pvg