[关闭]
@breakerthb 2016-10-20T02:57:07.000000Z 字数 2989 阅读 1692

Django数据导入

Django


Django 数据导入

从shell插入数据

$ python manage.py shell
In [1]: from article.models import Article
In [3]: Article.objects.create(title="blog of my site", category="blog", content="Today is sunny!")       
Out[3]: <Article: blog of my site>

这样就新增了一篇博文,我们查看一下

In [4]: Article.objects.all()
Out[4]: [<Article: blog of my site>, <Article: fwefrfdsf>, <Article: dfasfsda>, <Article: abd>]

还有两种方法(这两种差不多):

>>> blog2 = Blog()
>>> blog2.title = "title 2"
>>> blog2.content = "content 2"
>>> blog2.save()

或者

>>> blog2 = Blog(title="title 2",content="content 2")
>>> blog2.save()

批量导入

比如我们要导入一个文本,里面是标题、关键字和内容,中间用四个*隔开的,示例如下:

title 1****tag1****content 1
title 2****tag1****content 2
title 3****tag1****content 3
title 4****tag1****content 4
title 5****tag1****content 5
title 6****tag1****content 6
title 7****tag1****content 7
title 8****tag1****content 8
title 9****tag1****content 9

在最外面那个mysite(根目录)下写一个脚本,叫 txt2db.py,把 oldblog.txt 也放在mysite下

#!/usr/bin/env python
#coding:utf-8

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_blog.settings")

from article.models import Article

def main():
    try:
        with open('input.txt', "r") as fileIn:
            for line in fileIn:
                line = line.strip()
                print(line)

                (_title, _tag, _content) = line.split("****", 2)

                Article.objects.create(title=_title, category=_tag, content=_content)
    except:
        print("File open error")

if __name__ == "__main__":
    main()
    print('Done!')

好了,我们在终端运行它

$python txt2db.py

数据已经全部导入!

导入数据重复解决办法

django.db.models 中还有一个函数叫 get_or_create() 有就获取过来,没有就创建,用它可以避免重复,但是速度可以会慢些,因为要先尝试获取,看看有没有

只要把上面的

Article.objects.create(title=_title, category=_tag, content=_content)

换成下面的就不会重复导入数据了

Article.objects.get_or_create(title=_title, category=_tag, content=_content)

返回值是(BlogObject, True/False) 新建时返回 True, 已经存在时返回 False。

更多数据库API的知识请参见官网文档:QuerySet API

# 用fixture导入

最常见的fixture文件就是用python manage.py dumpdata 导出的文件

$  python manage.py dumpdata > fixture.json

$ python manage.py dumpdata article > fixture.json

示例如下:

[
  {
    "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 导入

$ python manage.py loaddata fixture.json

可以写一个脚本,把要导入的数据转化成 json 文件,这样导入也会更快些!

通过一条SQL语句执行

#!/usr/bin/env python
import os
os.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 循环会更快!!

#!/usr/bin/env python
import os
os.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__":
    main()
    print('Done!')

当然也可以利用数据中的导出,再导入的方法,见下一节。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注