我正在使用python 3.7,使用pyobc使用参数从熊猫数据框向SQL表插入多个值的列表,但始终会遇到以下编程错误:''',S)ProgrammingError :(“ 42000”,“ [42000] [Microsoft] [ODBC SQL Server驱动程序] [SQL Server]“ kkinner”附近的语法不正确。(102)(SQLExecDirectW); [42000] [Microsoft] [ODBC SQL Server驱动程序] [SQL Server]语句无法准备。(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']]
当尝试运行管理变量时,将出现以下错误:''',S)
ProgrammingError:('42000',“ [42000] [Microsoft] [ODBC SQL Server驱动程序] [SQL Server]'kkinner'附近的语法不正确。(102)(SQLExecDirectW); [42000] [Microsoft] [ODBC SQL Server驱动程序] [SQL Server]语句无法准备。(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',)]
当尝试运行管理变量时,将出现以下错误:''',params)
ProgrammingError:('42000',“ [42000] [Microsoft] [ODBC SQL Server驱动程序] [SQL Server]'kkinner'附近的语法不正确。(102)(SQLExecDirectW); [42000] [Microsoft] [ODBC SQL Server驱动程序] [SQL Server]语句无法准备。(8180)“)
就像已经提到的那样,您正在运行选择查询,因此您应该使用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()