django 批量导入数据

简介:

一、需求

我在数据库中建了一张表,用来保存ucloud云上的project id 和project name

models.py代码如下

1
2
3
4
5
6
7
8
9
10
#coding:utf-8
from  django.db  import  models
 
class  Project(models.Model):
     name  =  models.CharField(u '项目名称' ,max_length = 32 ,blank = True )
     id  =  models.CharField(u '项目ID' ,max_length = 32 ,unique = True ,primary_key = True ,blank = True )
     create_date  =  models.DateTimeField(u '创建时间' , auto_now_add = True )
     update_date  =  models.DateTimeField(u '更新时间' , auto_now = True )
     def  __unicode__( self ):
         return  self .name


admin.py代码如下

1
2
3
4
5
6
from  django.contrib  import  admin
from  ucloud.models  import  *
 
class  ProjectAdmin(admin.ModelAdmin):
     list_display  =  [ 'name' , 'id' ]
admin.site.register(Project,ProjectAdmin)

wKioL1i9NH_Dw8mwAABy5EJOxGo519.png

二、批量导入脚本

现在,我准备了一个脚本,通过UcloudAPI获取到了线上所有的项目的项目ID和项目名称

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/env python
#-*-coding:utf8-*-
from  Ucloud_API.config  import  *
from  Ucloud_API.sdk  import  UcloudApiClient
from  models  import  *
 
def  get_project_info():
     ApiClient  =  UcloudApiClient(base_url, public_key, private_key)
     Parameters  =  {
         "Action" "GetProjectList"
     }
     response  =  ApiClient.get( "/" , Parameters)
     ids  =  [
         { 'ProjectId' : _[ 'ProjectId' ],  'ProjectName' : _[ 'ProjectName' ]}
         for  in  response[ 'ProjectSet' ]
         ]
     return  ids
1
2
##脚本执行结果如下
[{ 'ProjectId' : u 'org-81' 'ProjectName' : u '\u4e0a\u6d77\u522b\u6837\u7ea2\u4fe1\u606f\u6280\u672f\u6709\u9650\u516c\u53f8' }, { 'ProjectId' : u 'org-ja1wvv' 'ProjectName' : u '\u5907\u6848\u4e13\u7528' }, { 'ProjectId' : u 'org-wrg10n' 'ProjectName' : u 'gitlab' }, { 'ProjectId' : u 'org-pni2a2' 'ProjectName' : u 'PublicTest' }, { 'ProjectId' : u 'org-kbxrx4' 'ProjectName' : u 'SPMS' }, { 'ProjectId' : u 'org-aws3dj' 'ProjectName' : u '\u5b89\u5168\u6d4b\u8bd5' }, { 'ProjectId' : u 'org-vzfixt' 'ProjectName' : u 'OTA' }, { 'ProjectId' : u 'org-et55qg' 'ProjectName' : u '99\u6570\u636e\u540c\u6b65\u4e2d\u8f6c\uff0c\u672c\u9879\u76ee\u4e0e99\u5185\u7f51\u6253\u901a\uff0c\u4e0d\u5141\u8bb8\u6dfb\u52a0\u4efb\u4f55\u673a\u5668' }, { 'ProjectId' : u 'org-ghan2t' 'ProjectName' : u 'Ops' }, { 'ProjectId' : u 'org-qf4d2n' 'ProjectName' : u 'iPms' }]

ProjectId对象表中的id字段,ProjectName对应表中的name字段。


下面是批量导入数据的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/usr/bin/env python
#-*-coding:utf8-*-
from  Ucloud_API.config  import  *
from  Ucloud_API.sdk  import  UcloudApiClient
from  models  import  *
 
##通过API获取数据
def  get_project_info():
     ApiClient  =  UcloudApiClient(base_url, public_key, private_key)
     Parameters  =  {
         "Action" "GetProjectList"
     }
     response  =  ApiClient.get( "/" , Parameters)
     ids  =  [
         { 'ProjectId' : _[ 'ProjectId' ],  'ProjectName' : _[ 'ProjectName' ]}
         for  in  response[ 'ProjectSet' ]
         ]
     return  ids
 
##批量导入数据
def  update_project_info():
     info  =  get_project_info()
     pids  =  []
     for  in  info:
         projectid  =  _[ 'ProjectId' ]
         pids.append(projectid)
         project  =  None
         try :
             project  =  Project.objects.get(pk = projectid)
         except  Project.DoesNotExist:
             project  =  Project(pk = projectid)
         project.name  =  _[ 'ProjectName' ]
         project.save()
     # 删除本地有但是ucloud上没有的项目
     projectids  =  [_[ 'pk' for  in  Project.objects. all ().values( 'pk' )]
     diff_ids  =  list ( set (projectids).difference( set (pids)))
     Project.objects. filter (pk__in = diff_ids).delete()

这里导入数据的思路如下:

1
2
3
4
try :
     project  =  Project.objects.get(pk = projectid)
except  Project.DoesNotExist:
     project  =  Project(pk = projectid)

先通过get方法获取对象,如果对象bu'存在,则用下面的方法创建该对象

1
project  =  Project(pk = projectid)

如果对象存在,通过下面的方法更新ProjectName

1
2
project.name  =  _[ 'ProjectName' ]
project.save()


另外还有一个需要注意的地方是,数据库中的数据要更新。

例如:线上之前有一个项目aaa,但是后来被删除了,那么则需要从数据库中删除该对象。

使用以下方法;

1
2
3
projectids  =  [_[ 'pk' for  in  Project.objects. all ().values( 'pk' )]
diff_ids  =  list ( set (projectids).difference( set (pids)))
Project.objects. filter (pk__in = diff_ids).delete()

将数据库中的对象列表转换成集合,将线上获取到的对象列表也转换成集合,然后通过

1
set1.difference(set2)

的方法来获取在set1中存在,但在set2中不存在的对象,然后用下面的方法删除

1
Project.objects. filter (pk__in = diff_ids).delete()


批量导入数据还可以使用下面的方法执行

1
2
3
4
5
6
7
8
9
10
def  update_project_info():
     info  =  get_project_info()
     pids  =  [_[ 'ProjectId' for  in  info]
     for  in  info:
         Project.objects.get_or_create( id = i[ 'ProjectId' ],name = i[ 'ProjectName' ])
     projectids  =  [_[ 'pk' for  in  Project.objects. all ().values( 'pk' )]
     #获取数据库中存在,但线上不存在的projectid
     diff_ids  =  list ( set (projectids).difference( set (pids)))
     #删除数据库中多余的数据
     Project.objects. filter (pk__in = diff_ids).delete()
1
Project.objects.get_or_create( id = i[ 'ProjectId' ],name = i[ 'ProjectName' ])

 get_or_create() 有就获取过来,没有就创建,用它可以避免重复,但是速度可以会慢些,因为要先尝试获取,看看有没有


三、如何执行脚本

我们可以将导入数据的方法通过问url的方式,来执行

1
2
3
4
5
6
7
8
9
10
#coding:utf-8
from  django.shortcuts  import  render
from  django.http  import  HttpResponse,JsonResponse
from  sdkucloud  import  *
# Create your views here.
def  index(request):
     return  HttpResponse( 'index' )
def  pull_project(request):
     update_project_info()
     return  HttpResponse( 'OK!' )

编辑$APPName/urls.py

1
2
3
4
5
6
7
from  django.conf.urls  import  include, url
from  django.contrib  import  admin
from  ucloud.views  import  *
urlpatterns  =  [
     url(r '^$' ,  index),
     url(r '^pull_project/$' , pull_project)
]










本文转自 曾哥最爱 51CTO博客,原文链接:http://blog.51cto.com/zengestudy/1903718,如需转载请自行联系原作者

目录
相关文章
|
5天前
|
前端开发 JavaScript BI
Django教程第5章 | Web开发实战-数据统计图表(echarts、highchart)
使用echarts和highcharts图表库实现折线图、柱状图、饼图和数据集图
71 2
|
7月前
|
监控 关系型数据库 Linux
Python采集linux服务器数据在Django Web界面展示
Python采集linux服务器数据在Django Web界面展示
|
5天前
|
设计模式 JSON 前端开发
前后端配置动态的数据字段标签(django_vue)
前后端配置动态的数据字段标签(django_vue)
22 0
|
5天前
|
SQL 缓存 数据库
Django ORM的性能优化:高效处理大量数据
【4月更文挑战第15天】本文介绍了优化Django ORM性能的六大技巧:1) 使用批量操作如bulk_create和bulk_update;2) 利用prefetch_related和select_related减少查询次数;3) 为常用字段添加索引;4) 优化数据库查询,避免循环查询;5) 使用缓存提升频繁查询性能;6) 在必要时使用原生SQL。这些策略能帮助处理大量数据时提升Django ORM的效率。
|
5天前
|
前端开发 API 数据库
Django(五):如何在Django中通过API提供数据库数据给前端
Django(五):如何在Django中通过API提供数据库数据给前端
|
5天前
|
测试技术 数据库 数据安全/隐私保护
实现Django Models的数据mock
实现Django Models的数据mock
28 0
|
5天前
|
JSON 数据可视化 前端开发
ssj兼职数据Django+pyecharts可视化展示
ssj兼职数据Django+pyecharts可视化展示
27 2
|
6月前
|
数据采集 存储 数据挖掘
Django爬虫:如何处理超过重试次数的请求以保障数据完整性
Django爬虫:如何处理超过重试次数的请求以保障数据完整性
|
7月前
|
关系型数据库 MySQL 数据库连接
Django实现多个MySQL数据库数据统一
Django实现多个MySQL数据库数据统一
|
9月前
|
数据库 Python
Django的多对多如何获取到数据并实现搜索分页
python manage.py makemigrations 应用名 python manage.py migrate 应用名 这两个命名是生成迁移文件和迁移数据库