千家信息网

django 批量导入数据

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,一、需求我在数据库中建了一张表,用来保存ucloud云上的project id 和project namemodels.py代码如下#coding:utf-8from django.db import
千家信息网最后更新 2026年11月01日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安全错误 数据库的锁怎样保障安全 花魁咖啡 互联网科技公司排名 中关村互联网 科技集团 互联网科技有限公司经营范围 涨乐互联网科技 工业互联网科技新基建 狮子座互联网科技有限公司 腾讯科技 互联网女皇 互联网科技素材视频竖屏 恒生科技互联网指数分析 深圳前海聚择互联网科技有限公司 欧洲十大科技互联网公司 科技互联网大厂 互联网科技公司营业执照怎么办理 滨湖区互联网智能科技产品有哪些 世界互联网科技成果奖 中国科技和美国互联网 广州三三互联网科技有限公司 好易买互联网科技 恒生科技互联网指数十大成分股 亿人帮互联网科技有限公司 国智互联网科技 科技互联网公司logo 注册互联网科技公司经营范围大全 速维有品互联网信息科技(苏州)有限公司 小米互联网科技园入驻 2021世界互联网领先科技成果发布 容联科技互联网电商 亚光科技低轨卫星互联网 科技美学互联网 艺术
0