Невозможно вставить список из нескольких значений в таблицу SQL с параметром, используя pyob c in python - PullRequest
0 голосов
/ 14 марта 2020

Я использую python 3.7 для вставки списка из нескольких значений из кадра данных panda в SQL таблицу с параметром, использующим pyob c, но всегда получаю ошибку программирования: '' ', S) ProgrammingError: (' 42000 ', "[42000] [Microsoft] [ODB C SQL Драйвер сервера] [SQL Сервер] Неверный синтаксис рядом с' kkinner '. (102) (SQLExecDirectW); [42000] [Microsoft] [ODB C SQL Драйвер сервера] [SQL Сервер] Не удалось подготовить оператор (ы). (8180) ")

python код:

import pandas as pd
import pyodbc
REQUESTOR=AllSTATUS[['Requestor']].dropna().drop_duplicates()
S=REQUESTOR.values.tolist()

con = pyodbc.connect(Driver='SQL Server',host='XXX',user='XXX',password='XXX')
cur=con.cursor()

 MANAGEMENT = cur.executemany(''' SELECT  
[WORKER NUMBER],
[WORKER USERNAME],
[WORKER FIRST NAME],
[WORKER LAST NAME],
[WORKER POSITION], 
[SUPERVISOR WORKER NUMBER],
[ WORKER USERNAME 1] AS [SUPERVISOR NAME]  
FROM #MANAGEMENT WHERE [WORKER USERNAME]=? DROP TABLE #MANAGEMENT''',S)

Вывод S: [['ANSONGOH'], ['JOY'], ['ANEO'], ['ALEX'], ['SIAO'], ['KOKK'], ['WUIYYYYUN'], ['WELIN'] ]

при попытке запустить переменную MANAGEMENT будет выдано сообщение об ошибке: '' ', S)

ProgrammingError: (' 42000 ', "[42000] [Microsoft] [ODB C SQL Драйвер сервера] [SQL Сервер] Неверный синтаксис рядом с 'kkinner'. (102) (SQLExecDirectW); [42000] [Microsoft] [ODB C SQL Драйвер сервера] [SQL Сервер] Оператор (ы) не может быть подготовлен. (8180) ")

Я пытался использовать код ниже, чтобы заменить S, но все еще получаю подобное сообщение об ошибке.

import pandas as pd
import pyodbc
REQUESTOR=AllSTATUS[['Requestor']].dropna().drop_duplicates() 
params = list(tuple(row) for row in REQUESTOR.values)

con = pyodbc.connect(Driver='SQL Server',host='XXX',user='XXX',password='XXX') 
cur=con.cursor() 
MANAGEMENT = cur.executemany(''' SELECT  
[WORKER NUMBER],
[WORKER USERNAME],
[WORKER FIRST NAME],
[WORKER LAST NAME],
[WORKER POSITION],
[SUPERVISOR WORKER NUMBER],
[ WORKER USERNAME 1] AS [SUPERVISOR NAME] 
FROM #MANAGEMENT
WHERE [WORKER USERNAME]=?
DROP TABLE #MANAGEMENT''',params)

Вывод параметров: [('ANSON',), ('JOY',), ('ANDY',), ('ALEX',), ('SIAO',), ( 'KOKKK',), ('WUIYUN',)] *

при попытке запустить переменную MANAGEMENT выдается ошибка: '' ', params)

ProgrammingError: ('42000', "[42000] [Microsoft] [ODB C SQL Драйвер сервера] [SQL Сервер] Неверный синтаксис рядом с 'kkinner'. (102) (SQLExecDirectW); [42000] [Microsoft] [ ODB C SQL Драйвер сервера] [SQL Сервер] Не удалось подготовить оператор (ы). (8180) ")

1 Ответ

1 голос
/ 14 марта 2020

, как уже упоминалось, вы выполняете запрос на выборку, поэтому вы должны использовать метод execute:

usernames = [i[0] for i in params] #convert params(list of tuples) to a list of strings

, а затем создать запрос с IN для всех ваших имен пользователей

 query = '''SELECT  
[WORKER NUMBER],
[WORKER USERNAME],
[WORKER FIRST NAME],
[WORKER LAST NAME],
[WORKER POSITION],
[SUPERVISOR WORKER NUMBER],
[ WORKER USERNAME 1] AS [SUPERVISOR NAME] 
FROM #MANAGEMENT
WHERE [WORKER USERNAME] IN ({0})'''.format(', '.join('?' for _ in usernames))

и, в конце концов, вы выполняете запрос:

cur.execute(query, usernames)

rows = cur.fetchall()
for row in rows:
    print(row)

или если вы действительно хотите вставить значения в БД, сделайте что-то вроде:

cur.executemany('INSERT INTO #MANAGEMENT ([WORKER USERNAME]) VALUES(?)', params)
con.commit()
...