Не все закрытия являются лямбдами, и не все лямбды закрытия. Оба - функции, но не обязательно таким образом мы привыкли знать.
лямбда А является по существу функцией, которая определяется встроенная, а не стандартный метод объявления функций. Лямбды могут часто раздаваться как объекты.
закрытие А является функцией, которая включает ее окружающее состояние путем ссылки на поля, внешние к ее телу. Вложенное состояние остается через вызовы закрытия.
На объектно-ориентированном языке, закрытия обычно обеспечиваются через объекты. Однако некоторые языки OO (например, C#) реализуют специальную функциональность, которая ближе к определению закрытий, обеспеченных просто функциональные языки (такие как шепелявость), которые не имеют объектов включить состояние.
то, Что интересно, - то, что введение Лямбд и Закрытия в C# приближают функциональное программирование к основному использованию.
Вы хотите проверить django.db.transaction.commit_manually
.
http://docs.djangoproject.com/en/dev/topics/db/ транзакции / # django-db-transaction-commit-manual
Это будет примерно так:
from django.db import transaction
@transaction.commit_manually
def viewfunc(request):
...
for item in items:
entry = Entry(a1=item.a1, a2=item.a2)
entry.save()
transaction.commit()
Которая будет фиксироваться только один раз, а не при каждом save ().
В django 1.3 были введены контекстные менеджеры. Итак, теперь вы можете использовать transaction.commit_on_success () аналогичным образом:
from django.db import transaction
def viewfunc(request):
...
with transaction.commit_on_success():
for item in items:
entry = Entry(a1=item.a1, a2=item.a2)
entry.save()
В django 1.4 был добавлен bulk_create
, позволяющий создавать списки объектов вашей модели и затем фиксировать их всех сразу.
ПРИМЕЧАНИЕ метод сохранения не будет вызываться при использовании массового создания.
>>> Entry.objects.bulk_create([
... Entry(headline="Django 1.0 Released"),
... Entry(headline="Django 1.1 Announced"),
... Entry(headline="Breaking: Django is awesome")
... ])
В django 1.6 был введен transaction.atomic , предназначенный для замены устаревших функций commit_on_success
и commit_manually
.
из документации django по atomic :
atomic можно использовать как декоратор:
from django.db import transaction
@transaction.atomic
def viewfunc(request):
# This code executes inside a transaction.
do_stuff()
и как диспетчер контекста:
from django.db import transaction
def viewfunc(request):
# This code executes in autocommit mode (Django's default).
do_stuff()
with transaction.atomic():
# This code executes inside a transaction.
do_more_stuff()
Взгляните на этот . Он предназначен для использования только с MySQL прямо из коробки, но есть указания о том, что делать с другими базами данных.
Возможно, вам лучше будет загружать элементы массово - подготовьте файл и используйте инструмент массовой загрузки. Это будет намного эффективнее, чем 8000 отдельных пластин.
Я рекомендую использовать простой SQL (не ORM), вы можете вставить несколько строк с помощью одной вставки:
insert into A select from B;
выбор из B часть вашего sql может быть столь же сложной как вы хотите, пока результаты соответствуют столбцам в таблице A и отсутствуют конфликты ограничений.