Что такое эффективный способ вставить тысячи записей в таблицу SQLite с помощью Django?

Не все закрытия являются лямбдами, и не все лямбды закрытия. Оба - функции, но не обязательно таким образом мы привыкли знать.

лямбда А является по существу функцией, которая определяется встроенная, а не стандартный метод объявления функций. Лямбды могут часто раздаваться как объекты.

закрытие А является функцией, которая включает ее окружающее состояние путем ссылки на поля, внешние к ее телу. Вложенное состояние остается через вызовы закрытия.

На объектно-ориентированном языке, закрытия обычно обеспечиваются через объекты. Однако некоторые языки OO (например, C#) реализуют специальную функциональность, которая ближе к определению закрытий, обеспеченных просто функциональные языки (такие как шепелявость), которые не имеют объектов включить состояние.

то, Что интересно, - то, что введение Лямбд и Закрытия в C# приближают функциональное программирование к основному использованию.

67
задан Cœur 6 September 2017 в 16:02
поделиться

4 ответа

Вы хотите проверить 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()
120
ответ дан 24 November 2019 в 14:35
поделиться

Взгляните на этот . Он предназначен для использования только с MySQL прямо из коробки, но есть указания о том, что делать с другими базами данных.

3
ответ дан 24 November 2019 в 14:35
поделиться

Возможно, вам лучше будет загружать элементы массово - подготовьте файл и используйте инструмент массовой загрузки. Это будет намного эффективнее, чем 8000 отдельных пластин.

3
ответ дан 24 November 2019 в 14:35
поделиться

Я рекомендую использовать простой SQL (не ORM), вы можете вставить несколько строк с помощью одной вставки:

insert into A select from B;

выбор из B часть вашего sql может быть столь же сложной как вы хотите, пока результаты соответствуют столбцам в таблице A и отсутствуют конфликты ограничений.

-1
ответ дан 24 November 2019 в 14:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: