1 回答
TA贡献1780条经验 获得超3个赞
看起来发生这种情况是因为 Pandas 不允许声明适当的ON CONFLICT策略,以防万一您尝试将数据附加到具有相同(唯一)主键或违反某些其他 UNIQUEness 约束的表。if_exists仅指整个表本身,而不指每个单独的行。
我认为您已经想出了一个很好的答案,也许稍加修改它就会对您有用:
# After connecting
for i in range(len(df)):
try:
df[df.index == i].to_sql(name='stocks', con=conn, if_exists='append', index=False)
conn.commit()
except sqlite3.IntegrityError:
pass
现在,如果您想在 Pandas 数据中出现较新的值时实际替换该值,并且假设您想替换数据库中的旧值,则这可能是一个问题。在这种情况下,您可能希望将原始 SQL 命令用作字符串,并迭代传递 Pandas 值。例如:
insert_statement = """
INSERT INTO stocks (stock_id,
stock_ticker,
{other columns})
VALUES (%s, %s, {as many %s as columns})
ON CONFLICT (stock_id) DO UPDATE
SET {Define which values you will update on conflict}"""
然后你就可以运行
for i in range(len(df)):
values = tuple(df.iloc[i])
cursor.execute(insert_statement, values)
添加回答
举报