如何解决循环通过槽数据框并在附加到数据库之前检查行
问题如何将我的数据框附加到数据库,以便它检查stock_ticker是否存在,而仅附加不存在stock_ticker的行?
这是我所做的过程
- 将CSV文件导入熊猫数据框
- 分配列名与数据库中的列名相同
- 使用下面的代码将数据帧发送到数据库,但得到
sqlite3.IntegrityError: UNIQUE constraint failed: stocks.stock_ticker
conn = sqlite3.connect('stockmarket.db')
c = conn.cursor()
df.to_sql(name='stocks',con=conn,if_exists='append',index=False)
conn.commit()
我查看了其他“完整性错误”案例,但似乎找不到与追加数据帧一起工作的案例?我发现并尝试了此操作,但它所做的只是不附加任何内容。
try:
conn = sqlite3.connect('stockmarket.db')
c = conn.cursor()
df.to_sql(name='stocks',index=False)
conn.commit()
except sqlite3.IntegrityError:
print("Already in database")
我不确定我是否正确理解了迭代过程
How to iterate over rows in a DataFrame in Pandas
所以我尝试了这个,但是它只是已经在数据库中为每个打印了。甚至更艰难的是,有4种新的股票行情自动收录器。
for index,row in df.iterrows():
try:
conn = sqlite3.connect('stockmarket.db')
c = conn.cursor()
df.to_sql(name='stocks',index=False)
conn.commit()
except sqlite3.IntegrityError:
print("Already in database")
任何感激的见解:)
解决方法
发生这种情况是因为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
现在,如果要在熊猫数据中出现一个较新的值并实际替换该值并且假设要替换数据库中的旧值时可能会出现问题。在这种情况下,您可能要使用原始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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。