Python 问题将数据插入my Postgres DB,错误:缺少列“的数据”;xyz",当实际有一个零作为值时

Python 问题将数据插入my Postgres DB,错误:缺少列“的数据”;xyz",当实际有一个零作为值时,python,postgresql,Python,Postgresql,在尝试将数据从API传输到PostgreSQL数据库时,我不断遇到此错误 下面是我的代码:由于API中的列的每一行中都有零,所以会发生错误。(请看本文末尾添加的图片以理解。下面是我用来将数据拉入并复制到数据库中的代码 def copy_from_stringio(conn, df, table): """ Here we are going save the dataframe in memory and use copy_from() t

在尝试将数据从API传输到PostgreSQL数据库时,我不断遇到此错误

下面是我的代码:由于API中的列的每一行中都有零,所以会发生错误。(请看本文末尾添加的图片以理解。下面是我用来将数据拉入并复制到数据库中的代码

def copy_from_stringio(conn, df, table):
    """
    Here we are going save the dataframe in memory 
    and use copy_from() to copy it to the table
    """
    # save dataframe to an in memory buffer
    buffer = StringIO()
    df.to_csv(buffer, index_label='id', header=False)
    buffer.seek(0)
    
    cursor = conn.cursor()
    try:
        cursor.copy_from(buffer, table, sep=",", null='')
        conn.commit()
    except (Exception, psycopg2.DatabaseError) as error:
        print("Error: %s" % error)
        conn.rollback()
        cursor.close()
        return 1
    print("copy_from_stringio() done")
    cursor.close()

def move_column_inplace(df, col, pos):
    col = df.pop(col)
    df.insert(pos, col.name, col)

previousday = {}
for x in tickers:
        r = requests.get(f"https://sandbox.iexapis.com/stable/stock/{x}/previous?token={IEX_SANDBOX_TOKEN}")
        try:
            data = r.json()
        except ValueError:
            print("Response content is not valid JSON")
            
        df = pd.DataFrame(data, index=[0])
        move_column_inplace(df, 'symbol', 0)

        previousday[x] = df


# for x in tickers:
#     copy_from_stringio(conn, previousday[x], 'security_price')
这是一张错误图片,正如您在
change\u over\u time
列中所看到的,您可以在单元格中看到一个0。这一API拉取中的每一行对该列都有一个零。该零干扰了拉取。我在创建模型时添加了一个
nullable=True
,希望修复错误,但这不起作用。我想保留p如果可能的话,在表格形状相同的情况下,可以更容易地提取数据。有人知道解决这个问题的方法或者更好的替代方案吗

[注意`随时间变化'列带有零]

这是我的表定义:

class SecurityPrice(Base):
    __tablename__ = 'security_price'
    idx = Column(Integer, autoincrement=True)
    id = Column(String, primary_key=True)
    date = Column('date', Date, nullable=False, primary_key=True)
    open = Column('open', Numeric)
    high = Column('high', Numeric)
    low = Column('low', Numeric)
    close = Column('close', Numeric)
    volume = Column('volume', BigInteger)
    adj_open = Column('adj_open', Numeric)
    adj_high = Column('adj_high', Numeric)
    adj_low = Column('adj_low', Numeric)
    adj_close = Column('adj_close', Numeric)
    adj_volume = Column('adj_volume', BigInteger)
    change = Column('change', Numeric)
    changepercent = Column('change_percent', Numeric)
    label = Column('label', String )
    changeovertime = Column('change_over_time', Numeric, nullable=True)
    #security_id = Column(String, ForeignKey('security.id',
    #                                 onupdate="CASCADE",
    #                                 ondelete="CASCADE"),
    #                                 nullable=False)
    # UniqueConstraint('date', 'security_id')
    security = relationship('security')

发现了问题,问题是我用来拉取和存储数据的API。开发人员在他们的一个表中添加了一个我不知道的列,这破坏了CSV分隔符的准确性,因此丢失了数据


故事的寓意是,确保你对用于重要内容的库是最新的!

你能在问题中放一个示例行吗?图像在关键部分用
将其缩写…您好,很有趣,也许可以在
COPY
命令中指定列名,并让它对其余部分使用默认值?@sabik hey,上面的datatable行不够吗?您看到的错误文本来自我的函数,它将JSON转换为CSV,然后将其复制到postgres。对;我仍然怀疑CSV中没有足够的逗号。我猜datatable行有帮助,尽管打印出
缓冲区的内容可能会显示一些奇怪的东西。此外,表定义是什么?列是否完全匹配?(在
COPY
命令中指定列名可以避免这种情况,例如,如果有自动行id列…)我在这里看到两个问题:(a)有一个额外的列,“label”;和(b)某些列的顺序不同,因此数据可能导入不正确。通过在
COPY
命令中指定列名,可以解析或至少检测到这两个列,并显示更好的错误消息。。。