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

后端 未结 9 760
暖寄归人
暖寄归人 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:21

    You might be better off bulk-loading the items - prepare a file and use a bulk load tool. This will be vastly more efficient than 8000 individual inserts.

    0 讨论(0)
  • 2020-11-30 18:23

    I recommend using plain SQL (not ORM) you can insert multiple rows with a single insert:

    insert into A select from B;
    

    The select from B portion of your sql could be as complicated as you want it to get as long as the results match the columns in table A and there are no constraint conflicts.

    0 讨论(0)
  • 2020-11-30 18:28
    def order(request):    
        if request.method=="GET":
            # get the value from html page
            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', '')
            prod_name = request.GET.getlist('prod_name[]', '')
            prod_qty = request.GET.getlist('prod_qty[]', '')
            prod_price = request.GET.getlist('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
    
                return HttpResponse('Your Record Has been Saved')
            except Exception as e:
                return HttpResponse(e)     
    
        return render(request, 'invoice_system/order.html')
    
    0 讨论(0)
  • 2020-11-30 18:29

    Have a look at this. It's meant for use out-of-the-box with MySQL only, but there are pointers on what to do for other databases.

    0 讨论(0)
  • 2020-11-30 18:35

    To answer the question particularly with regard to SQLite, as asked, while I have just now confirmed that bulk_create does provide a tremendous speedup there is a limitation with SQLite: "The default is to create all objects in one batch, except for SQLite where the default is such that at maximum 999 variables per query is used."

    The quoted stuff is from the docs--- A-IV provided a link.

    What I have to add is that this djangosnippets entry by alpar also seems to be working for me. It's a little wrapper that breaks the big batch that you want to process into smaller batches, managing the 999 variables limit.

    0 讨论(0)
  • 2020-11-30 18:37

    Bulk creation is available in Django 1.4:

    https://django.readthedocs.io/en/1.4/ref/models/querysets.html#bulk-create

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