Escape Имена столбцов, записываемые в SQL с помощью python, pyodbc из csv

Я довольно новичок в кодировании и застрял. Я получаю отчет через API, который дает мне файл .csv. Я хочу вставить это в базу данных SQL, но у меня возникают проблемы.

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

reader — это декодированный CSV-файл.

columns = next(reader,None)
query = "INSERT INTO table({0}) VALUES ({1})"
query = query.format(','.join(columns),','.join('?'*len(columns)))
cursor = cnxn.cursor()
cursor.execute(query, columns)
for data in reader:
    cursor.execute(query, data)
cursor.commit() 

Когда я запускаю код, я получаю эту ошибку:

pyodbc.ProgrammingError: («42000», «[42000] [Microsoft] [Драйвер ODBC 13 для SQL Server] [SQL Server] Неверный синтаксис рядом с ключевым словом «Группа». (156) (SQLExecDirectW)")

Я думаю, проблема в том, что мои столбцы:

Date |  Advertiser |    Campaign |  Ad Group | etc.

И кажется, что, возможно, SQL распознает «Группу» «Группы объявлений» как переменную.

Любые идеи? Спасибо.


person Jamesdabeard    schedule 29.08.2017    source источник
comment
Дело не в том, что он распознает его как переменную, а в том, что он не может его интерпретировать из-за пробела в имени столбца. Вам нужно будет поместить такое имя столбца в квадратные скобки, чтобы сервер sql мог его интерпретировать (и, как правило, в любом случае рекомендуется заключать все имена ваших столбцов в квадратные скобки) - поэтому вместо insert into table(date, advertiser, campaign, ad group) это должно быть insert into table([date], [advertiser], [campaign], [ad group])   -  person ZLK    schedule 30.08.2017
comment
@ZLK Большое спасибо. Это сработало. Теперь похоже, что мои данные передаются в виде строки Преобразование не удалось при преобразовании даты и/или времени из символьной строки. Случайно нет ли быстрого решения для этого?   -  person Jamesdabeard    schedule 30.08.2017
comment
Хм, это зависит от того, как выглядят ваши данные. Как выглядит поле даты?   -  person ZLK    schedule 30.08.2017
comment
Поле даты имеет формат 23.08.2017.   -  person Jamesdabeard    schedule 30.08.2017
comment
Это может быть проблема с форматом даты по умолчанию для SQL. Быстрое исправление может быть заключается в том, чтобы SET DATEFORMAT MDY; перед вставкой.   -  person ZLK    schedule 30.08.2017
comment
Дэн не совсем. Если я перейду непосредственно в редактор запросов и введу INSERT INTO Point_It_RTB ([Date]) Values ​​(8/21/2017), это сработает. Глядя на распечатку, я вижу: ['08/28/2017', 'Рекламодатель1', 'кампания1','группа объявлений1'] Нужно ли мне как-то удалять эти ' '?   -  person Jamesdabeard    schedule 30.08.2017


Ответы (1)


Как упоминалось в комментарии @ZLK, вам нужно заключить имена столбцов в квадратные скобки. Это поможет:

query = query.format('[{0}]'.format('], ['.join(columns)),','.join('?'*len(columns)))
person mechanical_meat    schedule 29.08.2017
comment
Это будет работать только в том случае, если ваши имена столбцов сами по себе не содержат квадратных скобок. Если вы хотите быть в большей безопасности, вам нужно также заменить ] на ]] в именах ваших динамических столбцов, прежде чем заключать их в квадратные скобки. Это предотвратит внедрение SQL и позволит вам иметь добросовестные скобки в именах столбцов. - person Tim; 30.08.2017