格式字符串mysql错误的参数不足

时间:2019-03-01 15:10:04

标签: python mysql pymysql

任何人都可以帮忙,我不知道为什么它会不断重现错误

  

错误:格式字符串的参数不足

它是从csv中读取的,其中的标题分别名为Property ID,Reference Number等。唯一的区别是表列名称中添加了_。

这是我的脚本供参考:

import csv
import pymysql


mydb = pymysql.connect(host='127.0.0.1', user='root', passwd='root', db='jupix', unix_socket="/Applications/MAMP/tmp/mysql/mysql.sock")
cursor = mydb.cursor()

with open("activeproperties.csv") as f:
    reader = csv.reader(f)
   # next(reader) # skip header
    data = []
    for row in reader:
    cursor.executemany('INSERT INTO ACTIVE_PROPERTIES(Property_ID, Reference_Number,Address_Name,Address_Number,Address_Street,Address_2,Address_3,Address_4,Address_Postcode,Owner_Contact_ID,Owner_Name,Owner_Number_Type_1,Owner_Contact_Number_1,Owner_Number_Type_2,Owner_Contact_Number_2,Owner_Number_Type_3,Owner_Contact_Number_3,Owner_Email_Address,Display_Property_Type,Property_Type,Property_Style,Property_Bedrooms,Property_Bathrooms,Property_Ensuites,Property_Toilets,Property_Reception_Rooms,Property_Kitchens,Floor_Area_Sq_Ft,Acres,Rent,Rent_Frequency,Furnished,Next_Available_Date,Property_Status,Office_Name,Negotiator,Date_Created)''VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)', row) 

mydb.commit()
cursor.close()
print"Imported!"

2 个答案:

答案 0 :(得分:1)

发生错误是因为您有37列试图插入数据,但是有38列输入要发送到数据库,即%s。因此,您要告诉游标将一条数据发送到数据库,但是游标不知道将数据插入到哪里。您要么忘记在INSERT INTO语句中添加一列,要么在语句中多余的%s

因此,您需要删除SQL语句中的%s之一,或在数据库中添加一列以将最后一条数据发送到其中。

答案 1 :(得分:1)

当列数很多时,确保每一列有一个%s可能是一个挑战。 INSERT有另一种语法,可以简化此操作。

代替此:

INSERT INTO ACTIVE_PROPERTIES(Property_ID, Reference_Number,
  Address_Name, Address_Number, Address_Street, Address_2, Address_3,
  Address_4, Address_Postcode, Owner_Contact_ID, Owner_Name,
  Owner_Number_Type_1, Owner_Contact_Number_1, Owner_Number_Type_2,
  Owner_Contact_Number_2, Owner_Number_Type_3, Owner_Contact_Number_3,
  Owner_Email_Address, Display_Property_Type, Property_Type,
  Property_Style, Property_Bedrooms, Property_Bathrooms, Property_Ensuites,
  Property_Toilets, Property_Reception_Rooms, Property_Kitchens,
  Floor_Area_Sq_Ft, Acres, Rent, Rent_Frequency, Furnished,
  Next_Available_Date, Property_Status, Office_Name, Negotiator,
  Date_Created)
VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
  %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
  %s, %s, %s, %s, %s)

尝试以下操作,以更轻松地将列与%s参数进行匹配,以免造成错误计数:

INSERT INTO ACTIVE_PROPERTIES
SET Property_ID = %s,
  Reference_Number = %s,
  Address_Name = %s,
  Address_Number = %s,
  Address_Street = %s,
  Address_2 = %s,
  Address_3 = %s,
  Address_4 = %s,
  Address_Postcode = %s,
  Owner_Contact_ID = %s,
  Owner_Name = %s,
  Owner_Number_Type_1 = %s,
  Owner_Contact_Number_1 = %s,
  Owner_Number_Type_2 = %s,
  Owner_Contact_Number_2 = %s,
  Owner_Number_Type_3 = %s,
  Owner_Contact_Number_3 = %s,
  Owner_Email_Address = %s,
  Display_Property_Type = %s,
  Property_Type = %s,
  Property_Style = %s,
  Property_Bedrooms = %s,
  Property_Bathrooms = %s,
  Property_Ensuites = %s,
  Property_Toilets = %s,
  Property_Reception_Rooms = %s,
  Property_Kitchens = %s,
  Floor_Area_Sq_Ft = %s,
  Acres = %s,
  Rent = %s,
  Rent_Frequency = %s,
  Furnished = %s,
  Next_Available_Date = %s,
  Property_Status = %s,
  Office_Name = %s,
  Negotiator = %s,
  Date_Created = %s;

这不是标准的SQL,但MySQL支持。它在内部执行相同的操作,这只是更方便的语法,至少在您一次插入一行时是这样。