1 回答

TA貢獻1780條經驗 獲得超4個贊
看起來發生這種情況是因為 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)
添加回答
舉報