没有足够的参数格式字符串mysql错误

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

任何人都可以帮助,我不知道为什么它会一直返回错误

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

它是从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!"
python mysql pymysql
2个回答
1
投票

发生错误的原因是您有37个列正在尝试插入数据,但是您要发送到数据库的38个输入,即%s。因此,您告诉光标将一段数据发送到数据库,但光标不知道将数据插入的位置。您要么忘记在INSERT INTO声明中包含一列,要么在声明中添加额外的%s

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


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支持的。它在内部做同样的事情,它只是更方便的语法,至少当你一次插入一行时。

© www.soinside.com 2019 - 2024. All rights reserved.