INSERT具有比表达式更多的目标列

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

我已经读了这个插入语句两天了,无法确定哪个额外的值被添加到插入查询中。表中的列数和插入查询中指定的列数是正确的,所以有人可以告诉我哪个正在增加额外的价值

我正在使用带有字典的python脚本来创建create和insert语句.PostgreSQL用于数据库。

python为Create创建的字符串

CREATE TABLE IF NOT EXISTS AiSTestTable(newID text not null constraint AiSTestTable_pkey  primary key,aismessagesourceid int,messagechecksum text,offset0 text,utcmonth int,aismessagerepeatind int,utcyear int,latitude2s float,increment0 text,timeout0 text,aismessageid int,positionaccuracy int,latitude int,communicationstate int,utcminute int,positionfixingdevice int,utcday int,messagedatestamp timestamp,spare int,messagerssi
float,utchour int,datafile text,messagefreq float,messagechecksumresult text,messagedecoded text,longitude2s float,longitude int,utcsecond int,messagelength int,transmissioncontrol int,aismessageidtext text,raimflag int,numberofslots0 text); ALTER table AiSTestTable OWNER to postgres;

python为Insert创建的字符串

INSERT INTO aistesttable (newID,aismessagesourceid,messagechecksum,offset0,utcmonth,aismessagerepeatind,longitude,latitude2s,increment0,timeout0,aismessageid,positionaccuracy,latitude,communicationstate,utcminute,positionfixingdevice,utcday,messagedatestamp,spare,messagerssi,utchour,datafile,messagefreq,messagechecksumresult,messagedecoded,longitude2s,utcyear,utcsecond,messagelength,transmissioncontrol,aismessageidtext,numberofslots0,raimflag) VALUES ('1','113669999','59','0000','0','0','5834147','45.72','0000','0000','4','1','27432000','0','60','1','0','2018-07-30 09:13:37 UTC','0000','0','-48.0772018433','24','Broker','161.975344','Fail','yes','9.72357833333','0','60','37','0','Basestation report','0000','0');

这是创建字符串的代码(newID是计数值)

TagString = str(d1.keys()).replace("['","").replace("']","").replace("', '",",")

TagType = str(d2).replace("': ["," ").replace("], '",",").replace("{'","").replace("}","").replace("'","").replace("]","").replace('"','').replace("[","")

newID="'"+str(c)+"'"+","

values=str(d1.values()).replace("[[","").replace("[","").replace("]","").replace(", '",",'")

commands = "CREATE TABLE IF NOT EXISTS AiSTestTable" + "(newID text not null constraint AiSTestTable_pkey  primary key,"+TagType+"); ALTER table AiSTestTable OWNER to postgres;"

insert = "INSERT INTO aistesttable (newID,"+TagString+")" + " VALUES " + "("+newID+values+");"

词典中的值

d1={'aismessagesourceid': ['113669999'], 'messagechecksum': ['59'], 'offset0': ['0000'], 'utcmonth': ['0'], 'aismessagerepeatind': ['0'], 'longitude': ['5834147'], 'latitude2s': ['45.72'], 'increment0': ['0000'], 'timeout0': ['0000'], 'aismessageid': ['4'], 'positionaccuracy': ['1'], 'latitude': ['27432000'], 'communicationstate': ['0'], 'utcminute': ['60'], 'positionfixingdevice': ['1'], 'utcday': ['0'], 'messagedatestamp': ['2018-07-30 09:13:37 UTC'], 'spare': ['0000', '0'], 'messagerssi': ['-48.0772018433'], 'utchour': ['24'], 'datafile': ['Broker'], 'messagefreq': ['161.975344'], 'messagechecksumresult': ['Fail'], 'messagedecoded': ['yes'], 'longitude2s': ['9.72357833333'], 'utcyear': ['0'], 'utcsecond': ['60'], 'messagelength': ['37'], 'transmissioncontrol': ['0'], 'aismessageidtext': ['Basestation report'], 'numberofslots0': ['0000'], 'raimflag': ['0']}

d2={'aismessagesourceid': ["'int'"], 'messagechecksum': ['text'], 'offset0': ['text'], 'utcmonth': ["'int'"],
'aismessagerepeatind': ["'int'"], 'utcyear': ["'int'"], 'latitude2s': ["'float'"], 'increment0': ['text'],
'timeout0': ['text'], 'aismessageid': ["'int'"], 'positionaccuracy': ["'int'"], 'latitude': ["'int'"], 'communicationstate': ["'int'"], 'utcminute': ["'int'"], 'positionfixingdevice': ["'int'"], 'utcday': ["'int'"], 'messagedatestamp': ['timestamp'], 'spare': ["'int'"], 'messagerssi': ["'float'"], 'utchour': ["'int'"],
'datafile': ['text'], 'messagefreq': ["'float'"], 'messagechecksumresult': ['text'], 'messagedecoded': ['text'], 'longitude2s': ["'float'"], 'longitude': ["'int'"], 'utcsecond': ["'int'"], 'messagelength': ["'int'"], 'transmissioncontrol': ["'int'"], 'aismessageidtext': ['text'], 'raimflag': ["'int'"], 'numberofslots0': ['text']}
sql postgresql python-2.7
3个回答
1
投票

该错误包含您需要知道的内容。 你在做什么:

INSERT INTO aistesttable (<A list of 33 column names>) VALUES (<A list of 34 values>)

您必须提供与提供列名一样多的值。在构建查询时,您遗漏了一些内容。

现在,为了创建额外的值,当我在Excel中将列名和值放在彼此的前面时,我得到以下内容。

从我看到的,很快就会出现不匹配(例如,utcmonth看起来不像一个月,经度和纬度包含数字,utcminute包含60)。

你不能用这种方法找出第一列发生不匹配的地方(小线索:转到d1>备用,它包含一个逗号)?

Excel parse


0
投票

有一个值'spare': ['0000', '0'],,你尝试通过使用.replace(", '",",'")连接成一个,它创建最终值'000','0',在insert命令中被解释为两个值。

你需要解决这个案子。如果你想要两个数字在一个字符串值,你可以使用.replace(", '" , ","),它创建最终值'000,0'


0
投票

错误在字段'spare'中,因为内容是一个数组['0000', '0']

当您创建插入字符串时,您将添加这些字段。

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