Python ('HY000','SQL包含21个参数标记,但提供了1个参数')

Python ('HY000','SQL包含21个参数标记,但提供了1个参数'),python,sql-server,python-3.x,csv,pypyodbc,Python,Sql Server,Python 3.x,Csv,Pypyodbc,我正在尝试读取csv文件并在SQL中上载。这是代码。我收到这个错误pypyodbc.ProgrammingError:'HY000',SQL包含21个参数标记,但提供了1个参数'My csv文件有21列。你知道如何解决这个问题吗 import csv import pypyodbc import traceback import sys import time import os.path import codecs # Create a connection to DataBase con

我正在尝试读取csv文件并在SQL中上载。这是代码。我收到这个错误pypyodbc.ProgrammingError:'HY000',SQL包含21个参数标记,但提供了1个参数'My csv文件有21列。你知道如何解决这个问题吗

import csv
import pypyodbc
import traceback
import sys
import time
import os.path
import codecs


# Create a connection to DataBase
con = pypyodbc.connect('DRIVER={SQL Server};SERVER=c1devsql01.XXXXXX.com;DATABASE=Parameters;UID=XXXXXX;PWD=XXXX@1')

cur = con.cursor()
query = "insert into Calc_Rules_Metadata_New (Calc_Set, Calc_Set_Identifier, Dependency, Data_Subset_Keys, Calc_Step, Calc_Variable, Calc_Operator, Calc_Operand, By_Variable, Where_Clause, Source_Tracking_Columns, Source_Tracking_Rows, Revision, Tag, Notes, Updated_By, Updated_On, IsDeleted, Metadata_Type, Calculation_Summary) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"

filename = str(sys.argv[1]) 
basedir = 'C:/RiskClient/InputData/Metadata/Calc'
fullpath = os.path.join(basedir, filename)

with open(fullpath, 'r') as csvfile:
    next(csvfile) # Skip Header 
    reader = csv.reader(csvfile, delimiter=',')
    for row in reader:
        #for i in range(len(row)):
            #if row[i] == '':
            #    row[i] = None
        print(row)    
        cur.execute(query, row)   
    cur.commit()
运行时错误:

['1', '1', '1b.B: Question Test 1', '', 'PFA_Unique_Identifier, Fund_Unique_Identifier; Business_Date', '1', 'Total_Borrowing', 'SUM', 'Borrowings_Data.Amount', '', "UPPER(Borrowings_Data.Commitment_Type) IN ('COMMITTED_AND_DRAWN', 'UNCOMMITTED') AND Borrowings_Data.Business_Date = &Rep_Date AND Fund_Unique_Identifier In (select Fund_Unique_Identifier from Fund_Level_Information where Applicable_PF_Sections IS NOT NULL AND PFA_Unique_Identifier = &PFA_UID AND Business_Date = &Rep_Date)", '', '', '', '', '', '', '', '', 'Test Form', '']
Traceback (most recent call last):
  File "C:\RiskClient\InputData\Metadata\Calc\CalcMetadata.py", line 47, in <module>
    cur.execute(query, row)
  File "C:\Program Files\Python3.5.2\lib\site-packages\pypyodbc-1.3.3-py3.5.egg\pypyodbc.py", line 1470, in execute
  File "C:\Program Files\Python3.5.2\lib\site-packages\pypyodbc-1.3.3-py3.5.egg\pypyodbc.py", line 1263, in _BindParams
pypyodbc.ProgrammingError: ('HY000', 'The SQL contains 20 parameter markers, but 21 parameters were supplied')

您提供的是一个列表,而不是一整套位置参数。你什么时候提供那21个?在查询字符串中,但仅在cur.executequery中的行中,您实际上是说要将该列表填充到第一行中?还没有为剩下的二十个提供任何参数。要解决此问题,您需要提供如下*参数:


确保您的行(即此场景中的列表)中实际包含21项。否则,您仍然会遇到一个错误,即没有提供正确数量的参数。

谢谢大家。我自己解决了这个问题。基本上运行时错误“HY000”,“SQL包含21个参数标记,但提供了1个参数”在csv列计数与insert查询参数不一致时出现。在本例中,我的cvs文件映射了一个标识列Id,该标识列Id不应该在csv文件中,因为该标识列Id应该由SQL Server生成并自动递增。从csv文件中删除该列可修复此问题。谢谢。

试试cur.executequery、*行或cur.executequery、tuplerow。不确定API是什么。已尝试。。但是仍然得到相同的运行时错误。在cur.execute之前添加一个printrow以查看它是什么。添加了注释,上面提供了输出。如消息所述,SQL包含20个参数标记,但提供了21个参数。实际上,lenrow==21,query.count'?'==20。再加一个?参数标记。
cur.execute(query, *row)