25

因为我通常不会在 Django 项目中对我的模型进行前期设计,所以我最终会大量修改模型,因此每次都会删除我的测试数据库(因为“syncdb”永远不会为您自动更改表)。下面是我的工作流程,我想听听你的。欢迎任何想法..

  1. 修改模型。
  2. 删除测试数据库。(对我来说总是一个简单的 sqlite 数据库。)
  3. 运行“同步数据库”。
  4. 通过代码生成一些测试数据。
  5. 转到 1。

关于这个的第二个问题..如果您的工作流程像上面那样,您如何执行 4. 步骤?您是手动生成测试数据还是在 Django 应用程序中有适当的挂钩点,您可以在服务器启动时注入测试数据生成代码?\

TIA。

4

6 回答 6

22

步骤 2 和 3 可以一步完成:

manage.py reset appname

据我了解,第 4 步最容易管理,方法是使用固定装置

于 2009-01-30T23:29:45.337 回答
15

这是 Django 固定装置的工作。它们很方便,因为它们独立于数据库,并且测试工具(和 manage.py)具有对它们的内置支持。

要使用它们:

  1. 使用管理工具在您的应用程序中设置您的数据(称之为“foo”)
  2. 在您的“foo”应用程序目录中创建一个fixtures 目录
  3. 类型:python manage.py dumpdata --indent=4 foo > foo/fixtures/foo.json

现在,在您的 syncdb 阶段之后,您只需键入:

 python manage.py loaddata foo.json

您的数据将被重新创建。

如果您希望它们出现在测试用例中:

class FooTests(TestCase):
    fixtures = ['foo.json']

请注意,如果您的架构发生巨大变化,您将不得不重新创建或手动更新您的固定装置。

您可以在 django docs for Fixture Loading中阅读更多关于fixture 的信息

于 2009-01-30T23:32:02.197 回答
12

这就是我们所做的。

  1. 应用程序以架构版本号命名。 appa_2,appb_1等。

  2. 微小的变化不会改变数字。

  3. 重大更改会增加数字。同步数据库有效。并且可以编写“数据迁移”脚本。

    def migrate_appa_2_to_3():
        for a in appa_2.SomeThing.objects.all():
            appa_3.AnotherThing.create( a.this, a.that )
            appa_3.NewThing.create( a.another, a.yetAnother )
        for b in ...
    

关键是 drop 和 recreate 并不总是合适的。有时将数据从旧模型移动到新模型而不从头开始重建会很有帮助。

于 2009-01-31T02:39:00.573 回答
11

南方最酷。

虽然当数据无关紧要时,好的 ol' 重置效果最好。

http://south.aeracode.org/

于 2009-03-12T00:33:46.143 回答
4

为了补充 Matthew 的回复,我还经常使用自定义 SQL 来提供此处记录的初始数据。

Django 只是在或期间创建表后在其中查找文件<app>/sql/<modelname>.sql并运行它们。当我需要从其他非 Django 数据库表中填充我的 Django 表时,我会使用自定义 SQL。syncdbsqlreset

于 2009-01-31T02:43:29.737 回答
1

就我个人而言,我的开发数据库是针对我现在正在处理的一个项目的,它相当大,所以我使用dmigrations创建数据库迁移脚本来修改数据库(而不是像我一开始那样每次都清除数据库)。

编辑:实际上,我现在正在使用 South :-)

于 2009-01-31T02:48:53.907 回答