【问题标题】:INSERT has more target columns than expressionsINSERT 的目标列多于表达式
【发布时间】:2019-08-15 16:23:39
【问题描述】:

我已经阅读此插入语句两天了,无法确定向插入查询添加了哪些额外值。表中的列数和插入查询中指定的列数是正确的,请问有人可以吗告诉我正在添加哪些额外价值

我正在使用带有字典的 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']}

【问题讨论】:

    标签: sql postgresql python-2.7


    【解决方案1】:

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

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

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

    现在对于创建的额外值,当我在 Excel 中将列名和值放在彼此前面时,我得到以下信息。

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

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

    【讨论】:

    • 发现问题。字典中的Spare包含两个值:['0000', '0']
    【解决方案2】:

    您尝试使用 .replace(", '",",'") 将值 'spare': ['0000', '0'], 连接成一个值,这将创建最终值 '000','0',在插入命令中解释为两个值。

    您需要解决这种情况。如果您希望两个数字都在一个字符串值中,您可以使用 .replace(", '" , ",") ,它会创建最终值 '000,0'

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-20
        • 2017-04-20
        相关资源
        最近更新 更多