Django数据导入
从网上下载的一些数据,excel表格,xml文件,txt文件等有时候我们想把它导入数据库,应该如何操作呢?
以下操作符合 Django版本为 1.6 ,兼顾 Django 1.7, Django 1.8 版本,理论上Django 1.4, 1.5 也没有问题,没有提到的都是默认值
备注:你可能会问数据从哪儿来的,比如你用python从以前的blog上获取过来的,想导入现在的博客,或者别人整理好的数据,或者你自己整理的excel表,一个个地在网站后台复制粘贴你觉得好么?这就是批量导入的必要性。
下载本教程源代码:
mysite.zip
建议先不要看源码,按教程一步步做下去,遇到问题再试试源代码,直接复制粘贴,很快就会忘掉,自己动手打一遍
我们新建一个项目 mysite, 再新建一个 app,名称为blog
|
1
2
3
|
django-admin.py startproject mysitecd mysitepython manage.py startapp blog |
把 blog 中的 models.py 更改为以下内容
|
1
2
3
4
5
6
7
8
9
10
11
|
#!/usr/bin/python#coding:utf-8from django.db import modelsclass Blog(models.Model): title = models.CharField(max_length=100) content = models.TextField() def __unicode__(self): return self.title |
不要忘了把 blog 加入到 settings.py 中的 INSTALLED_APPS 中。
|
1
2
3
4
5
6
7
|
# Application definitionINSTALLED_APPS = ( ... # 添加上 blog 这个 app 'blog',) |
一,同步数据库,创建相应的表
|
1
|
python manage.py syncdb |
Django 1.6以下版本会看到:

Django 创建了一些默认的表,注意后面那个红色标记的blog_blog是appname_classname的样式,这个表是我们自己写的Blog类创建的
Django 1.7.6及以上的版本会看到:(第六行即为创建了对应的blog_blog表)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
Operations to perform: Synchronize unmigrated apps: blog Apply all migrations: admin, contenttypes, auth, sessionsSynchronizing apps without migrations: Creating tables... Creating table blog_blog Installing custom SQL... Installing indexes...Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying sessions.0001_initial... OKYou have installed Django's auth system, and don't have any superusers defined.Would you like to create one now? (yes/no): yesUsername (leave blank to use 'tu'): tuEmail address: Password: Password (again): Superuser created successfully. |
二,输入 python manage.py shell
进入该项目的django环境的终端(windows如何进入对应目录?看 Django环境搭建 的 3.2 部分)
先说如何用命令新增一篇文章:
|
1
2
3
4
|
$ python manage.py shell>>> from blog.models import Blog>>> Blog.objects.create(title="The first blog of my site", content="I am writing my blog on Terminal") |
这样就新增了一篇博文,我们查看一下
|
1
2
|
>>> Blog.objects.all() # 获取所有blog[<Blog: The first blog of my site>] |
还有两种方法(这两种差不多):
|
1
2
3
4
5
6
7
|
>>> blog2 = Blog()>>> blog2.title = "title 2">>> blog2.content = "content 2">>> blog2.save()或者>>> blog2 = Blog(title="title 2",content="content 2")>>> blog2.save() |
后面两种方法也很重要,尤其是用在修改数据的时候,要记得最后要保存一下 blog.save(),第一种Blog.objects.create()是自动保存的。
三,批量导入
比如我们要导入一个文本,里面是标题和内容,中间用四个*隔开的,示例(oldblog.txt):
|
1
2
3
4
5
6
7
8
9
|
title 1****content 1title 2****content 2title 3****content 3title 4****content 4title 5****content 5title 6****content 6title 7****content 7title 8****content 8title 9****content 9 |
在终端导入有时候有些不方便,我们在 最外面那个 mysite目录下写一个脚本,叫 txt2db.py,把 oldblog.txt 也放在mysite下
|
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
|
#!/usr/bin/env python#coding:utf-8import osos.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings"
'''Django 版本大于等于1.7的时候,需要加上下面两句import djangodjango.setup()否则会抛出错误 django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.'''import djangoif django.VERSION >= (1, 7):#自动判断版本 django.setup()def main(): from blog.models import Blog f = open('oldblog.txt') for line in f: title,content = line.split('****') Blog.objects.create(title=title,content=content) f.close()if __name__ == "__main__": main() print('Done!') |
这里如果oldblog.txt要全地址的话要这样:
open("C:\\Users\\Rajrishi\\Documents\\MyJava\\text.txt") # meh
open(r"C:\Users\Rajrishi\Documents\MyJava\text.txt") # better
open("C:/Users/Rajrishi/Documents/MyJava/text.txt") # also possible
可能是因为\有转义字符的意思,所以settings里面都是用/
好了,我们在终端运行它
|
1
2
|
python txt2db.py# 运行完后显示 一个 Done! 导入完成! |
运行完毕后会打出一个 "Done!", 数据已经全部导入!
四,导入数据重复 解决办法
如果你导入数据过多,导入时出错了,或者你手动停止了,导入了一部分,还有一部分没有导入。或者你再次运行上面的命令,你会发现数据重复了,怎么办呢?
django.db.models 中还有一个函数叫 get_or_create() 有就获取过来,没有就创建,用它可以避免重复,但是速度可以会慢些,因为要先尝试获取,看看有没有
只要把上面的
|
1
|
Blog.objects.create(title=title,content=content) |
换成下面的就不会重复导入数据了
|
1
|
Blog.objects.get_or_create(title=title,content=content) |
返回值是(BlogObject, True/False) 新建时返回 True, 已经存在时返回 False。
更多数据库API的知识请参见官网文档:QuerySet API
五, 用fixture导入
最常见的fixture文件就是用python manage.py dumpdata 导出的文件,示例如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
[ { "model": "myapp.person", "pk": 1, "fields": { "first_name": "John", "last_name": "Lennon" } }, { "model": "myapp.person", "pk": 2, "fields": { "first_name": "Paul", "last_name": "McCartney" } }] |
你也可以根据自己的models,创建这样的json文件,然后用 python manage.py loaddata fixture.json 导入
详见:https://docs.djangoproject.com/en/dev/howto/initial-data/
可以写一个脚本,把要导入的数据转化成 json 文件,这样导入也会更快些!
六,Model.objects.bulk_create() 更快更方便
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#!/usr/bin/env pythonimport osos.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")def main(): from blog.models import Blog f = open('oldblog.txt') BlogList = [] for line in f: title,content = line.split('****') 高能分词 blog = Blog(title=title,content=content) BlogList.append(blog) f.close() Blog.objects.bulk_create(BlogList)if __name__ == "__main__": main() print('Done!') |
由于Blog.objects.create()每保存一条就执行一次SQL,而bulk_create()是执行一条SQL存入多条数据,做会快很多!当然用列表解析代替 for 循环会更快!!
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#!/usr/bin/env pythonimport osos.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")def main(): from blog.models import Blog f = open('oldblog.txt') BlogList = [] for line in f: parts = line.split('****') BlogList.append(Blog(title=parts[0], content=parts[1])) f.close() # 以上四行 也可以用 列表解析 写成下面这样 # BlogList = [Blog(title=line.split('****')[0], content=line.split('****')[1]) for line in f] Blog.objects.bulk_create(BlogList)if __name__ == "__main__": 这招有点像c语言的main函数定义入口 main() print('Done!') |
Django数据导入的更多相关文章
- [Django]数据批量导入
前言:历经一个月的复习,考试终于结束了.这期间上班的时候有研究了Django网页制作过程中,如何将数据批量导入到数据库中. 这个过程真的是惨不忍睹,犯了很多的低级错误,这会在正文中说到的.再者导入数据 ...
- Django数据操作F和Q、model多对多操作、Django中间件、信号、读数据库里的数据实现分页
models.tb.objects.all().using('default'),根据using来指定在哪个库里查询,default是settings中配置的数据库的连接名称. 外话:django中引 ...
- 使用openpyxl模块将Excel中的数据导入数据库
这里将不介绍openpyxl模块的详细操作. 主要就是记录一个使用openpyxl模块将Excel表格的数据导入数据库中的实例. from openpyxl import load_workbook ...
- django后台导入excel文件
1.django 如何从后台上传excel中批量解析数据 要从django后台导入的excel中批量解析数据,举一个例子,我们向后抬批量导入svn历史数据数据格式 假设excel表中有4列,每列分别是 ...
- Django模块导入
Django模块导入篇 Django基础 urls.py 导入app中的视图函数 from app名字 import views app.view视图函数中导入models.py中的类 from ap ...
- ITTC数据挖掘平台介绍(五) 数据导入导出向导和报告生成
一. 前言 经过了一个多月的努力,软件系统又添加了不少新功能.这些功能包括非常实用的数据导入导出,对触摸进行优化的画布和画笔工具,以及对一些智能分析的报告生成模块等.进一步加强了平台系统级的功能. 马 ...
- FineReport实现EXCEL数据导入自由报表
在制作填报报表的时候,对于空白填报表,常常导出为Excel,派发给各部门人员填写后上交.如何能避免手动输入,直接将Excel中的数据导入到填报表中提交入库呢? 这里以一个简单的员工信息填报示例进行介绍 ...
- Execl数据导入sql server方法
在日常的程序开发过程中,很多情况下,用户单位给予开发人员的数据往往是execl或者是access数据,如何把这些数据转为企业级是数据库数据呢,下面就利用sqlserver自带的功能来完成此项任务. 首 ...
- kettle将Excel数据导入oracle
导读 Excel数据导入Oracle数据库的方法: 1.使用PL SQL 工具附带的功能,效率比较低 可参考这篇文章的介绍:http://www.2cto.com/database/201212/17 ...
随机推荐
- myeclipse maven 安装
myeclipse 上安装 Maven3 环境准备: JDK 1.6.45 Maven 3.0.5 myeclipse 8.5 安装 Maven 之前要求先确定你的 JDK 已经安装配置完成.Ma ...
- for_each(c++11)
http://www.cplusplus.com/reference/algorithm/for_each/ template<class InputIterator, class Functi ...
- MarkdownPad2 表格不显示处理
1.添加表格的扩展 工具 >选项 > Markdown >Markdown处理器 改为 “Markdown(扩展)”即可. 2.在设置的过程中要注册markdownpad2 邮箱: ...
- android系统release签名
转自:http://blog.csdn.net/yangkai6121/article/details/38682321 为什么需要给Android系统签个名才能进行CTS认证呢?原来我们通过make ...
- shell循环语句
所有的笔记只记录一些例子,根据例子解释一些出现的语法,不介绍具体的语法 2015-07-01 21:58:33 星期三 for循环 用例一用for循环在家目录下创建aaa1-aaa10,然后在aaa1 ...
- ExtJs服务器端代理(Ajax)
服务器端代理: Ajax:在当前域中发送请求 JsonP:跨域的请求 Rest:与服务器进行RESTful(GET/PUT/POST/DELETE)交互 Direct:使用 Ext.direct.M ...
- 使用Spring发送带附件的电子邮件(站内和站外传送)
JavaMail的介绍 JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.它可以方便地执行一些常用的邮件传输. 虽然JavaMail是 ...
- viewgager
CycleRotationView:自定义控件,主要功能是实现类似与各种商城首页的广告轮播图.其实像这种比较常见的自定义控件早就满大街了,虽然说"不要重复发明轮子",但是不代表不用 ...
- Drools API的使用学习
Drools API的使用学习在 Drools 当中,规则的编译与运行要通过 Drools 提供的各种 API 来实现,这些 API 总体来讲可以分为三类:规则编译.规则收集和规则的执行.完成这些工作 ...
- 安装ganglia
安装ganglia 1.默认已经配置好相关的主机名和Ip地址映射关系 2.默认已经安装好ssh密码登陆 3.默认已经配置好yum源和相关网络配置(如hosts 可在墙外) 4.服务器端安装(除了yum ...