无法在python中使用pyobc将带有参数的多个值列表插入SQL表中

问题描述 投票:0回答:1

我正在使用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)“)

python sql sql-server pyodbc
1个回答
0
投票

就像已经提到的那样,您正在运行选择查询,因此您应该使用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()
© www.soinside.com 2019 - 2024. All rights reserved.