我有一个简单的任务,它正在发挥作用,但它正在漫长地完成。任务包括从api (json文件)检索数据,并比较该数据是否已经在数据库上。
如果数据位于数据库= update项上,则on =insert。
为此,我循环遍历数据库上的一组当前item_id,并为每个场景执行语句。例如:
For item in data_json:
if item[item_id] in setid_db:
cursor.execute(update...)
else:
cursor.execute(insert...)已经尝试过fast_executemany,但速度几乎相同。
在另一个任务上,我只需要一次从一个数据中插入所有数据,所以我使用了df.to_sql和method=multi和chunksize = 50,它工作得很好,而且速度更快。只是还不知道如何完成当前任务的等效操作。任何帮助都将不胜感激。
PS.:在第一次将数据从API (例如30k项)加载到数据库之后,可能是在下一个负载上只有200个数据需要更新或插入。因此,在这些场景中使用df.to_sql将覆盖数据库中的所有现有数据。这就是为什么我需要执行这些语句,并且要做得比快得多。
发布于 2022-07-16 02:34:22
也许您可以将您的data_json预处理为两组:一组需要插入(数据库中不存在),另一组需要更新(数据库中已经存在)。然后,您可以将df.to_sql调用与method="multi"和chunksize=50一起使用。您可以使用data_json直接将pandas.DataFrame(data_json)转换为Pandas DataFrame (这里假设data_json是Python对象,可能是字典,而不是JSON格式的字符串)。
如果可以首先将data_json转换为数据帧,则可以运行
df = pd.DataFrame(data_json)
df.loc[lambda D: D.item_id.isin(setid_db), :].to_sql(<UPDATE>)
df.loc[lambda D: ~D.item_id.isin(setid_db), :].to_sql(<INSERT>)https://stackoverflow.com/questions/73001030
复制相似问题