Синтаксическая ошибка с параметризованными запросами после переключения с pyodbc на pymssql

У меня есть необработанные файлы размером 13-15 МБ для загрузки их данных в БД, и для вставки около 30-35 000 строк требуется около 50-55 минут, используя executemany с pyodbc, и все работало нормально, но время обработки было высоким.

Для тестирования производительности я попробовал pymssql, но он показывает синтаксическую ошибку здесь

x = [('a',1),('b',2).... ]  # inserting only 999 rows at a time
qry = "INSERT INTO ["+tablename+"] VALUES({}) ".format(placeholders)
cursor.executemany(qry,x)

print qry
 # INSERT INTO [my_T] VALUES(?,?,?,?,?,?,?,?,?,?,?,?...) 

AT executemany() это ошибка

Ошибка:

Ошибка в loadData (102, "Неверный синтаксис рядом с"? ". Сообщение об ошибке DB-Lib 20018, серьезность 15:\n Общая ошибка SQL Server: проверка сообщений от SQL Server\n"

1 ответ

Решение

Спецификация Python DB-API 2.0 определяет несколько стилей параметров, которые могут использовать разработчики.

pyodbc принял стиль "qmark", который является наиболее распространенным стилем для ODBC

INSERT INTO tablename (col1, col2) VALUES (?, ?)

в то время как pymssql выбрал стиль "формат"

INSERT INTO tablename (col1, col2) VALUES (%s, %s)

Обратите внимание, что по историческим причинам pymssql поддерживает %d так же как %s но нам не нужно использовать %s для строк и %d для номеров; %s работает во всех случаях и является предпочтительным заполнителем.

Другие вопросы по тегам