What is an efficient way of inserting thousands of records into an SQLite table using Django?

后端 未结 9 761
暖寄归人
暖寄归人 2020-11-30 17:41

I have to insert 8000+ records into a SQLite database using Django\'s ORM. This operation needs to be run as a cronjob about once per minute.
At the moment I\'m using a

相关标签:
9条回答
  • 2020-11-30 18:38

    You want to check out django.db.transaction.commit_manually.

    http://docs.djangoproject.com/en/dev/topics/db/transactions/#django-db-transaction-commit-manually

    So it would be something like:

    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()
    

    Which will only commit once, instead at each save().

    In django 1.3 context managers were introduced. So now you can use transaction.commit_on_success() in a similar way:

    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()
    

    In django 1.4, bulk_create was added, allowing you to create lists of your model objects and then commit them all at once.

    NOTE the save method will not be called when using bulk create.

    >>> Entry.objects.bulk_create([
    ...     Entry(headline="Django 1.0 Released"),
    ...     Entry(headline="Django 1.1 Announced"),
    ...     Entry(headline="Breaking: Django is awesome")
    ... ])
    

    In django 1.6, transaction.atomic was introduced, intended to replace now legacy functions commit_on_success and commit_manually.

    from the django documentation on atomic:

    atomic is usable both as a decorator:

    from django.db import transaction
    
    @transaction.atomic
    def viewfunc(request):
        # This code executes inside a transaction.
        do_stuff()
    

    and as a context manager:

    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()
    
    0 讨论(0)
  • 2020-11-30 18:38
    def order(request):    
        if request.method=="GET":
            cust_name = request.GET.get('cust_name', '')
            cust_cont = request.GET.get('cust_cont', '')
            pincode = request.GET.get('pincode', '')
            city_name = request.GET.get('city_name', '')
            state = request.GET.get('state', '')
            contry = request.GET.get('contry', '')
            gender = request.GET.get('gender', '')
            paid_amt = request.GET.get('paid_amt', '')
            due_amt = request.GET.get('due_amt', '')
            order_date = request.GET.get('order_date', '')
            print(order_date)
            prod_name = request.GET.getlist('prod_name[]', '')
            prod_qty = request.GET.getlist('prod_qty[]', '')
            prod_price = request.GET.getlist('prod_price[]', '')
            print(prod_name)
            print(prod_qty)
            print(prod_price)
            # insert customer information into customer table
            try:
                # Insert Data into customer table
                cust_tab = Customer(customer_name=cust_name, customer_contact=cust_cont, gender=gender, city_name=city_name, pincode=pincode, state_name=state, contry_name=contry)
                cust_tab.save()
                # Retrive Id from customer table
                custo_id = Customer.objects.values_list('customer_id').last()   #It is return
    Tuple as result from Queryset
                custo_id = int(custo_id[0]) #It is convert the Tuple in INT
                # Insert Data into Order table
                order_tab = Orders(order_date=order_date, paid_amt=paid_amt, due_amt=due_amt, customer_id=custo_id)
                order_tab.save()
                # Insert Data into Products table
                # insert multiple data at a one time from djanog using while loop
                i=0
                while(i<len(prod_name)):
                    p_n = prod_name[i]
                    p_q = prod_qty[i]
                    p_p = prod_price[i]
                    # this is checking the variable, if variable is null so fill the varable value in database
                    if p_n != "" and p_q != "" and p_p != "":
                        prod_tab = Products(product_name=p_n, product_qty=p_q, product_price=p_p, customer_id=custo_id)
                        prod_tab.save()
                    i=i+1
    
    0 讨论(0)
  • 2020-11-30 18:39

    You should check out DSE. I wrote DSE to solve these kinds of problems ( massive insert or updates ). Using the django orm is a dead-end, you got to do it in plain SQL and DSE takes care of much of that for you.

    Thomas

    0 讨论(0)
提交回复
热议问题