Python 问题将数据插入my Postgres DB,错误:缺少列“的数据”;xyz",当实际有一个零作为值时
在尝试将数据从API传输到PostgreSQL数据库时,我不断遇到此错误 下面是我的代码:由于API中的列的每一行中都有零,所以会发生错误。(请看本文末尾添加的图片以理解。下面是我用来将数据拉入并复制到数据库中的代码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
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
命令中指定列名,可以解析或至少检测到这两个列,并显示更好的错误消息。。。