yge*_*her 6 django optimization
在 Django 项目中,我每天从外部 API 刷新数万行数据。问题是,由于我不知道数据是新的还是只是更新,我无法进行bulk_create操作。
注意:有些行,或者很多行,实际上并没有每天更改,但我不知道哪些或多少行提前。
所以现在我这样做:
for row in csv_data:
try:
MyModel.objects.update_or_create(id=row['id'], defaults={'field1': row['value1']....})
except:
print 'error!'
Run Code Online (Sandbox Code Playgroud)
它需要......永远!每秒一两行,最大速度,有时每行几秒钟。我刷新的每个模型都有一个或多个其他模型通过外键连接到它,所以我不能只是将它们全部删除并每天重新插入。我无法解决这个问题——我怎样才能显着减少数据库操作的数量,以便刷新不会花费数小时和数小时。
谢谢你的帮助。
问题是您正在对从 api 获取的每个数据行执行数据库操作。您可以通过了解哪些行是新行(并对所有新行进行批量插入)、哪些行实际需要更新以及哪些行没有更改来避免这样做。详细说明:
old_data = MyModel.objects.all() # if possible than do MyModel.objects.filter(...)
Run Code Online (Sandbox Code Playgroud)
api_data = [...]
Run Code Online (Sandbox Code Playgroud)
for row in api_data:
if is_new_row(row, old_data):
new_rows_array.append(row)
else:
if is_data_modified(row, old_data):
...
# do the update
else:
continue
MyModel.objects.bulk_create(new_rows_array)
Run Code Online (Sandbox Code Playgroud)
is_new_row - 将了解该行是否为新行并将其添加到将被批量创建的数组中
is_data_modified - 将在旧数据中查找该行并了解该行的数据是否已更改,并且仅在其更改时才更新
| 归档时间: |
|
| 查看次数: |
6493 次 |
| 最近记录: |