django 批量导入数据
发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,一、需求我在数据库中建了一张表,用来保存ucloud云上的project id 和project namemodels.py代码如下#coding:utf-8from django.db import
千家信息网最后更新 2025年01月19日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安全错误
数据库的锁怎样保障安全
徐州东之方网络技术有限公司
数据库怎么防止分散
可以在哪些数据库中查找外国法律
暗黑破坏神2 重制版服务器
深圳佐名互联网科技
游戏服务器 框架
登录淘宝助手未能正确连接服务器
数据库一致性要求
上海web服务器托管
服务器可以做资金盘吗
网络安全行业初创企业
党和国家网络安全战略
即时通讯软件开发哪家服务好
unix迭代服务器
人类享受了网络技术带来的方便
求职上海网络技术
网络技术硬件连接
软件开发部门岗设置位
怎么配置网页服务器
云服务器建立访客用户
数据库为什么会变成可疑
湖南永州网络安全宣传
泾县智能软件开发服务生产过程
手机连接不了服务器怎么解决
基础网络安全防护措施
雷塞定位板卡软件开发
云技术和数据库的区别
数据库中关系数据模型
egg框架上传图片到服务器
如何选择武汉软件开发公司