Python для загрузки файлов csv с ошибкой «необходимо объявить скалярную переменную»

Я пытаюсь выполнить оператор sql с помощью python, возвращает ошибку.

Я в основном пытаюсь вставить несколько записей csv из папки в sql. Я хотел бы вставлять записи csv построчно в sql, не создавая фрейм данных. Я сделал переменную со строкой, содержащей оператор sql. Я использую эту переменную в функции выполнения. так - cur1.execute(sql_query, row)

import os
import csv
import pyodbc
import time

conn1 = pyodbc.connect(r'Driver = {SQL Server};'
                       r'Server=Servername;'
                       r'Database=Testing;'
                       r'Trusted_Connection=yes;')

cur1 = conn1.cursor()

start = time.time()
sql_query ='INSERT INTO testing01( EmployeeID'\
           ',EmployeeName'\
           ',ProjectID'\
           ',WBSElement'\
           ',StartDate'\
           ',EndDate'\
           ',AbsenceAttendanceHours'\
           ',AllocationPercent'\
           ',CRMID'\
           ',PCMTID'\
           ',ProjectPracticeID' \
           ',ProjectSBU' \
           ',SBUAbbrivation' \
           ',ProjSBUName' \
           ',ProjectPractice'\
           ',EmployeeSBU' \
           ',EmployeePractice' \
           ',EmployeeSubPractice' \
           ',ProjectProfile' \
           ',ProjectReason' \
           ',BillType' \
           ',SubBillType'\
           ',CustomerName'\
           ',ProjectManagerID'\
           ',ProjectManager'\
           ',DeliveryManagerID' \
           ',DeliveryManager' \
           ',SupervisorID' \
           ',Supervisor'\
           ',RoleSite'\
           ',RoleID' \
           ',C' \
           ',ActivityType' \
           ',RoleStatus' \
           ',CountryName' \
           ',EmployeeGrade' \
           ',JoiningDate' \
           ',ResourceGroup'\
           ',PersonnelArea' \
           ',PersonnelSubArea' \
           ',CustomerSite' \
           ',LastWorkingDayDate' \
           ',NameofEEsubgroup'\
           ',RoleName'\
           ',StreamName'\
           ',SkillName'\
           ',SkillGroup'\
           ',PrimarySkill'\
           ',Billability'\
           ',AmtInLocCur'\
           ',Currency'\
           ',RoleFTE'\
           ',OffshoreAmount'\
           ',OnsiteAmount'\
           ',EmployeeStatus'\
           ',BusinessLead'\
           ',BusinessLeadName)' 'values(?,?,?,?,?,?' \
           '?,?,?,?,?,?,?'\
           '?,?,?,?,?,?' \
           '?,?,?,?,?' \
           '?,?,?,?,?,?' \
           '?,?,?,?,?,?' \
           '?,?,?,?,?,?' \
           '?,?,?,?,?,?' \
           '?,?,?,?,?,?' \
           '?,?,?,?)'

for files in os.listdir("C://Users/XXX/Desktop/ABC/ZCP/"):
    print(files)
    with open("C://Users/XXX/Desktop/ABC/ZCP/" + files, "r") as file:
        readercsv = csv.reader(file)
        next(readercsv)
        for row in readercsv:
            cur1.execute(sql_query, row)

            conn1.commit()
print("success attrition")


end = time.time()
print(end - start)

Я хочу знать необходимые изменения, чтобы заставить это работать. Ошибка, которую я получаю:

cur1.execute(sql_query, row)
pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Must declare the scalar variable "@P6@P7". (137) (SQLExecDirectW); [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could not be prepared. (8180)')

Спасибо.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
468
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не разделяете ?, переданное между новыми строками, запятой, например:

'values(?,?,?,?,?,?' \ 
       '?,?,?,?,?,?,?'\

Нет, когда первая строка и вторая строка объединяются, они образуют строку следующим образом:

 values(?,?,?,?,?,??,?,?,?,?,?,?
# note            ^^

Поэтому вам нужно обязательно добавить запятую после завершающего ? в каждой строке, кроме последней.

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