django 批量导入数据
发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,一、需求我在数据库中建了一张表,用来保存ucloud云上的project id 和project namemodels.py代码如下#coding:utf-8from django.db import
千家信息网最后更新 2024年09月22日django 批量导入数据
一、需求
我在数据库中建了一张表,用来保存ucloud云上的project id 和project name
models.py代码如下
#coding:utf-8from django.db import modelsclass 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代码如下
from django.contrib import adminfrom ucloud.models import *class ProjectAdmin(admin.ModelAdmin): list_display = ['name','id']admin.site.register(Project,ProjectAdmin)
二、批量导入脚本
现在,我准备了一个脚本,通过UcloudAPI获取到了线上所有的项目的项目ID和项目名称
#!/usr/bin/env python#-*-coding:utf8-*-from Ucloud_API.config import *from Ucloud_API.sdk import UcloudApiClientfrom 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
##脚本执行结果如下[{'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字段。
下面是批量导入数据的代码:
#!/usr/bin/env python#-*-coding:utf8-*-from Ucloud_API.config import *from Ucloud_API.sdk import UcloudApiClientfrom 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()
这里导入数据的思路如下:
try: project = Project.objects.get(pk=projectid)except Project.DoesNotExist: project = Project(pk=projectid)
先通过get方法获取对象,如果对象bu'存在,则用下面的方法创建该对象
project = Project(pk=projectid)
如果对象存在,通过下面的方法更新ProjectName
project.name = _['ProjectName']project.save()
另外还有一个需要注意的地方是,数据库中的数据要更新。
例如:线上之前有一个项目aaa,但是后来被删除了,那么则需要从数据库中删除该对象。
使用以下方法;
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()
将数据库中的对象列表转换成集合,将线上获取到的对象列表也转换成集合,然后通过
set1.difference(set2)
的方法来获取在set1中存在,但在set2中不存在的对象,然后用下面的方法删除
Project.objects.filter(pk__in=diff_ids).delete()
批量导入数据还可以使用下面的方法执行
def update_project_info(): info = get_project_info() pids = [_['ProjectId'] for _ in info] for i 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()
Project.objects.get_or_create(id=i['ProjectId'],name=i['ProjectName'])
get_or_create() 有就获取过来,没有就创建,用它可以避免重复,但是速度可以会慢些,因为要先尝试获取,看看有没有
三、如何执行脚本
我们可以将导入数据的方法通过问url的方式,来执行
#coding:utf-8from django.shortcuts import renderfrom django.http import HttpResponse,JsonResponsefrom 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
from django.conf.urls import include, urlfrom django.contrib import adminfrom ucloud.views import *urlpatterns = [ url(r'^$', index), url(r'^pull_project/$', pull_project)]
数据
对象
方法
项目
数据库
脚本
面的
代码
更新
名称
字段
时间
地方
思路
方式
结果
速度
需求
准备
尝试
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
关闭服务器权限
渡口网络安全
成都学习网络技术学校
bit型变量数据库
安徽网络技术咨询价格信息
海康存储服务器编程安装全过程
网络安全的繁体字怎么写
职工讲堂网络安全
大话西游2最近新开服务器
贵州大数据子母钟服务器云主机
软件开发需要参考什么
qq 数据库 下载64位
雷柏科技转型互联网
老百姓要知道的网络安全法
将csv导入vf数据库
小程序 diy 带数据库
dns服务器地址怎么设置
癌症基因组图谱都有哪些数据库
数据库窗口分区符
系统损坏数据库数据怎么导出
通图采集软件开发公司
出口服务器软件没有报关单
六一软件开发
境外媒体炒作网络安全
包商银行软件开发
excel 导入数据库
舟山软件开发制作
电网与网络安全法
地铁逃生地铁逃生服务器
数据库输出价格最高的三种图书