我已经读了两天的插入语句,无法确定正在向插入查询中添加哪个额外值。表中的列数和插入查询中指定的列数是正确的,所以有人可以吗告诉我正在增加哪些附加值
我正在使用带有字典的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 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']}
答案 0 :(得分:1)
该错误恰好包含您需要了解的内容。
您正在做什么:
INSERT INTO aistesttable (<A list of 33 column names>) VALUES (<A list of 34 values>)
您必须提供与提供列名一样多的值。建立查询时您错过了一些东西。
现在要创建的额外值是,当我在Excel中将列名和值放在彼此前面时,将得到以下内容。
据我所见,很快就会出现不匹配的情况(例如utcmonth看起来不像一个月,经度和纬度包含数字,utcminute包含60)。
您不能使用这种方法来找出不匹配发生的第一列的地方(线索很少:转到d1>备用,它包含一个逗号)?
答案 1 :(得分:0)
存在一个值'spare': ['0000', '0'],
,您尝试使用.replace(", '",",'")
将其连接为一个,该值将创建最终值'000','0'
,在插入命令中将其解释为两个值。
您需要解决这种情况。如果您希望两个数字都在一个字符串值中,则可以使用.replace(", '" , ",")
,它会创建最终值'000,0'
答案 2 :(得分:0)
该错误位于字段'spare'
中,因为内容是一个数组['0000', '0']
。
在创建插入字符串时,您将添加这些字段。