Python 向.executemany提供数据帧值以进行更新

Python 向.executemany提供数据帧值以进行更新,python,sql-server,pandas,dataframe,pyodbc,Python,Sql Server,Pandas,Dataframe,Pyodbc,我需要通过python更新MSSQL中的excel数据。 因此,首先我阅读excel文件,其中只有一行,并对数据类型进行必要的更改: import pyodbc import pandas as pd df = pd.read_excel('test_new.xlsx') first_col = df.pop('number') df['number'] = first_col df['sys_created_on'] = df['sys_created_on'].dt.strftime('%

我需要通过python更新MSSQL中的excel数据。 因此,首先我阅读excel文件,其中只有一行,并对数据类型进行必要的更改:

import pyodbc 
import pandas as pd
df = pd.read_excel('test_new.xlsx')
first_col = df.pop('number')
df['number'] = first_col
df['sys_created_on'] = df['sys_created_on'].dt.strftime('%Y-%m-%d %H:%M:%S')
df['opened_at'] = df['opened_at'].dt.strftime('%Y-%m-%d %H:%M:%S')
df['resolved_at'] = df['resolved_at'].dt.strftime('%Y-%m-%d %H:%M:%S')
df['sys_updated_on'] = df['sys_updated_on'].dt.strftime('%Y-%m-%d %H:%M:%S')
df.fillna('', inplace=True)
records = df.to_records(index=False)
result = list(records)
result
上述陈述给出了结果。结果是一个列表

[('Sha', 'po1301', 'Closed', 'TLS - Admin', 15585, 'Store Network', 'Switch', 'CATS0005587', '', 'mic.vin.com ', 'pis - opo', 'LEC NIN', '2020-08-11 23:56:03', '1 Pro 1 LLC', '', '', 'Switch', '', '', '', 'Phone', 'oshi3001', 'Resolved', '"Approved Tech\r\n1. troubleshooting.\r\n"\r\n\r\n\r\nIMPORTANT - TECH SHOULD CALL NOC ON ARRIVAL', 'No', False, '1 - High', '0-6 hours', False, 'mada gill', '7-ELEVEN STORE - 38578', '', '2020-08-11 23:56:03', 'john win', '1 - Critical', 6, '', 'Not Solved (Not Reproducible)', 'duplicate case, see notes', 59022, '2020-08-12 16:19:45', '', 'UNKNOWN', '3 - Low', 'Store is hard down', 1, 'Power Verification', 'svd', '1 - High', '2020-08-12 16:19:45', False, 'INC1090099')] 
在这一部分之后,我创建了一个SQL update语句:

conn = pyodbc.connect()
cursor = conn.cursor()
cursor.executemany("Update proj.[mid].[datahub] SET assigned_to = ?, [caller_id#user_name] = ?, state = ?, assignment_group = ?, business_duration = ?, business_service = ?, category = ?, u_category_structure = ?, u_resolution_ci = ?, resolved_by = ?, u_resolver_group = ?, u_service_provider = ?, sys_created_on = ?, caller_id = ?, u_caller_first_name = ?, u_caller_last_name = ?, u_vendor_category = ?, rfc = ?, closed_at = ?, closed_by = ?, contact_type = ?, sys_created_by = ?, u_customer_portal_state = ?, description = ?, u_first_call_resolution = ?, u_first_time_fix = ?, impact = ?, u_incident_age = ?, knowledge = ?, reopened_by = ?, location = ?, u_on_behalf_of = ?, opened_at = ?, opened_by = ?, priority = ?, reassignment_count = ?, u_resolution_method = ?, close_code = ?, close_notes = ?, calendar_stc = ?, resolved_at = ?, u_sd_esclation = ?, sla_due = ?, severity = ?, short_description = ?, reopen_count = ?, subcategory = ?, sys_updated_by = ?, urgency = ?, sys_updated_on = ?, [assigned_to#active] = ? WHERE number = ?", result)
cursor.commit()
它给出了错误: ProgrammingError:executemany的第二个参数必须是序列、迭代器或生成器

由于某些原因,当它确实是一个列表时,它不会将结果变量作为列表。 如果我在cursor.executemany中打印语句,然后执行该语句,它会更新数据,但是使用包含列表的结果变量,它不起作用

请提供帮助。

result=printlisttuplerecords 将结果打印到控制台,但打印函数本身不返回任何结果。相反,您应该省略records调用并像这样分配结果

结果=listdf.itertuplesindex=False 。。。如果你愿意,就把它打印出来

打印结果 编辑:完整的工作示例 cnxn=pyodbc.connectDSN=mssqlLocal64 crsr=cnxn.cursor 设置测试环境 crsr.executeCREATE表tmp txt varchar10,id int主键 执行 插入到tmp txt中,id值 “old_foo”,1,“old_bar”,2 printcsr.executeSELECT*自tmp.fetchall 控制台输出: [old_foo',1',old_bar',2] 测验 df=pd.DataFrame[new\u foo,1,new\u bar,2],columns=[txt,id] 结果=listdf.itertuplesindex=False crsr.executemanyUPDATE tmp SET txt=?其中id=?,result printcsr.executeSELECT*自tmp.fetchall 控制台输出: [new_foo',1',new_bar',2]
你不应该在第二个参数中传递记录而不是结果吗?这给出了相同的结果。嗨,Gord,我急切地等待着你的回答。我更新了我的问题。我尝试了您的方法,但仍然得到相同的错误:TypeError:“参数必须在列表、元组或行中”,“HY000”。我不知道为什么它不把结果识别为列表,而实际上它是一个列表。一如往常。你的名字应该是上帝。你是我唯一可靠的助手。多谢各位。