dumpscript

概要:生成单独的Python脚本,包含指定app对应的数据库数据对象.可以用来将数据表导入数据库.

dumpscript 命令生成单独的Python脚本,包含了转换成Python对象的数据库数据.这种方法比直接创建数据库或通过XML创建数据库更容易理解,扩展性也更好.

为什么有这个功能

这样做的有几点好处:

  • 数据库变更时会少出现些莫名其妙的错误: 不依赖ID的外键,会忽略掉新增和删除的列
  • 编辑脚本后可以自动生成很多的实例数据

例如,编辑一个脚本,生成一些测试的初始数据到数据库中:

for i in xrange(2000):
    poll = Poll()
    poll.question = "Question #%d" % i
    poll.pub_date = date(2001,01,01) + timedelta(days=i)
    poll.save()

真实情况下数据库可能更大更复杂,通常是通过Admin后台生成一下测试数据,再导出脚本.编辑导出的脚本,得到更多的数据.

特性支持

  • 外键和多对多关系(通过Python变量,而不是ID)
  • 外键或多对多中对自己的引用
  • models子类
  • ContentType 字段类型,并生成关联关系(查看 issue 43)
  • 递归引用
  • 排除自增字段
  • 父类不会被包含,除非没有子类继承它
  • 可以引用单独的类

还不支持的特性

  • 完美的支持引用字段(比如 自增字段 的引用)
  • Intermediate join tables: issue 48
  • GIS字段: issue 72 [1]

如何使用

从指定的app中导出所有models的建表语句:

$ ./manage.py dumpscript appname > scripts/testdata.py

导出指定模型的数据,添加参数 appname.ModelName

$ ./manage.py dumpscript appname.ModelName > scripts/testdata.py

清空指定app对应数据库数据,然后重新加载数据:

$ ./manage.py reset appname
$ ./manage.py runscript testdata

提示: runscript 命令只能执行在 scripts 模块下的脚本,所以要在 scripts 目录下创建 __init__.py 文件.

警告

命名冲突

在命名输出文件时不要与当前环境路径下的文件重名,否则会引起import异常.比如输出到的目标文件与app目录重名时,脚本会尝试加载输出文件而不是app,这是不正确的.

例子:

# 错误用法
$ ./manage.py dumpscript appname > dumps/appname.py

# 正确用法
$ ./manage.py dumpscript appname > dumps/appname_all.py

# 正确用法
$ ./manage.py dumpscript appname.Somemodel > dumps/appname_somemodel.py
[1]GIS字段依赖于数据库,不同的数据库生成GIS的方式和索引不同