为什么在 django-import-export 中不起作用 use_bulk?
Why in django-import-export doesn't work use_bulk?
我使用 django-import-export 2.8.0
和 Oracle 12c
.
通过 import_data()
逐行导入没有问题,但是当我打开 use_bulk=True
选项时,它停止导入并且不会抛出任何错误。
为什么不起作用?
resources.py
class ClientsResources(resources.ModelResource):
class Meta:
model = Clients
fields = ('id', 'name', 'surname', 'age', 'is_active')
batch_size = 1000
use_bulk = True
raise_errors = True
views.py
def import_data(request):
if request.method == 'POST':
file_format = request.POST['file-format']
new_employees = request.FILES['importData']
clients_resource = ClientsResources()
dataset = Dataset()
imported_data = dataset.load(new_employees.read().decode('utf-8'), format=file_format)
result = clients_resource.import_data(imported_data, dry_run=True, raise_errors=True)
if not result.has_errors():
clients_resource.import_data(imported_data, dry_run=False)
return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
data.csv
id,name,surname,age,is_active
18,XSXQAMA,BEHKZFI,89,Y
19,DYKNLVE,ZVYDVCX,20,Y
20,GPYXUQE,BCSRUSA,73,Y
21,EFHOGJJ,MXTWVST,93,Y
22,OGRCEEQ,KJZVQEG,52,Y
--UPD--
我使用了 django-debug-toolbar
,发现导入查询有一个非常奇怪的行为。
管理面板不起作用。我see all importing rows, but next it writes "Import finished, with 5 new and 0 updated clients.", and see this strange queries
然后我使用 import by my form 和这里同时出现的情况:
use_bulk 来自 django-import-export (more)
为了比较我的句柄create_bulk()
--UPD2--
我尝试跟踪导入逻辑并查看发现的内容:
import_export/resources.py
def bulk_create(self, using_transactions, dry_run, raise_errors, batch_size=None):
"""
Creates objects by calling ``bulk_create``.
"""
print(self.create_instances)
try:
if len(self.create_instances) > 0:
if not using_transactions and dry_run:
pass
else:
self._meta.model.objects.bulk_create(self.create_instances, batch_size=batch_size)
except Exception as e:
logger.exception(e)
if raise_errors:
raise e
finally:
self.create_instances.clear()
此 print() 显示空列表的值。
此问题似乎是由于 django-import-export
的 2.x 版本中的错误所致。它已在 v3 中修复。
- 当 运行 在批量模式下 (
use_bulk=True
) 时存在错误
save_instance()
中的逻辑是发现 'new' 个实例设置了 pk
个值,然后错误地将它们视为更新,而不是创建。
- 我无法确定这将如何发生。这可能与使用 Oracle 有关(虽然我看不出如何)。
我使用 django-import-export 2.8.0
和 Oracle 12c
.
通过 import_data()
逐行导入没有问题,但是当我打开 use_bulk=True
选项时,它停止导入并且不会抛出任何错误。
为什么不起作用?
resources.py
class ClientsResources(resources.ModelResource):
class Meta:
model = Clients
fields = ('id', 'name', 'surname', 'age', 'is_active')
batch_size = 1000
use_bulk = True
raise_errors = True
views.py
def import_data(request):
if request.method == 'POST':
file_format = request.POST['file-format']
new_employees = request.FILES['importData']
clients_resource = ClientsResources()
dataset = Dataset()
imported_data = dataset.load(new_employees.read().decode('utf-8'), format=file_format)
result = clients_resource.import_data(imported_data, dry_run=True, raise_errors=True)
if not result.has_errors():
clients_resource.import_data(imported_data, dry_run=False)
return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
data.csv
id,name,surname,age,is_active
18,XSXQAMA,BEHKZFI,89,Y
19,DYKNLVE,ZVYDVCX,20,Y
20,GPYXUQE,BCSRUSA,73,Y
21,EFHOGJJ,MXTWVST,93,Y
22,OGRCEEQ,KJZVQEG,52,Y
--UPD--
我使用了 django-debug-toolbar
,发现导入查询有一个非常奇怪的行为。
管理面板不起作用。我see all importing rows, but next it writes "Import finished, with 5 new and 0 updated clients.", and see this strange queries
然后我使用 import by my form 和这里同时出现的情况:
use_bulk 来自 django-import-export (more)
为了比较我的句柄create_bulk()
--UPD2--
我尝试跟踪导入逻辑并查看发现的内容:
import_export/resources.py
def bulk_create(self, using_transactions, dry_run, raise_errors, batch_size=None):
"""
Creates objects by calling ``bulk_create``.
"""
print(self.create_instances)
try:
if len(self.create_instances) > 0:
if not using_transactions and dry_run:
pass
else:
self._meta.model.objects.bulk_create(self.create_instances, batch_size=batch_size)
except Exception as e:
logger.exception(e)
if raise_errors:
raise e
finally:
self.create_instances.clear()
此 print() 显示空列表的值。
此问题似乎是由于 django-import-export
的 2.x 版本中的错误所致。它已在 v3 中修复。
- 当 运行 在批量模式下 (
use_bulk=True
) 时存在错误
save_instance()
中的逻辑是发现 'new' 个实例设置了pk
个值,然后错误地将它们视为更新,而不是创建。- 我无法确定这将如何发生。这可能与使用 Oracle 有关(虽然我看不出如何)。