12

我有一个相当复杂的 Django 项目,这使得使用固定装置来加载数据变得困难/不可能。

我想做的是在测试运行程序创建所有表之后和实际测试开始运行之前从生产数据库服务器加载数据库转储。

我在 MyTestCase.setUp() 中尝试了各种“魔法”,但没有运气。

任何建议都将受到欢迎。谢谢。

4

3 回答 3

8

Django 支持在执行 syncdb、reset 或启动测试运行程序时加载 SQL 文件——这正是您所描述的:

http://docs.djangoproject.com/en/dev/howto/initial-data/#providing-initial-sql-data

您需要在您的应用程序目录中创建一个“sql”目录,然后在该目录中放置一个名为“mymodel.sql”的文件(其中“MyModel”是对应的模型名称)。

myproject/
   |--myapp/
       |--sql/
           |--mymodel.sql

您可以使用转储工具为您的数据库创建此 SQL。

  • SQLite [1]: 回声 '.dump' | sqlite3 yourdbname.sqlite > myapp/sql/mymodel.sql
  • MySQL [2]:mysqldump yourdbname > myapp/sql/mymodel.sql
  • PostgreSQL [3]:pg_dump yourdbname > myapp/sql/mymodel.sql

转储后,您需要编辑文件以删除除适当的 INSERT 语句或其他复杂内容之外的所有内容。特别是,您必须删除事务处理、索引创建和表创建 SQL 以避免加载重复的创建语句时出错。

我使用这种方法来加载非常非常大的装置——处理 json 需要很长时间,但是直接 sql 导入非常快。

请注意,除了为测试运行程序加载数据之外,此方法还将为任何调用 synchdb、reset 等加载 sql - 因此您将无法为不同的测试用例提供不同的数据,并且您如果您不希望将文件加载回生产服务器,则必须在重置之前删除文件。

[1] http://www.sqlite.org/sqlite.html

[2] http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html

[3] http://www.postgresql.org/docs/8.1/static/backup.html#BACKUP-DUMP

于 2010-04-07T01:39:22.290 回答
1

您可能需要考虑定义自定义测试运行器。这里有一些信息:https ://docs.djangoproject.com/en/dev/topics/testing/advanced/#other-testing-frameworks

基本上我认为你可以从 django.test.simple.run_tests 复制默认的测试运行器,然后修改它以满足你的需要。

我以前没有这样做过,但据我了解,这将是定制它的方式。

于 2009-12-31T00:37:39.800 回答
-1

固定装置是最好的选择。您是否尝试过使用 ./manage.py dumpdata 从您当前的数据库中创建一个夹具?我还没有看到在复杂模型上失败,但我想这是可能的。

假设您使用的是 mysql,您应该可以使用mysqldump编写脚本。

于 2009-12-30T14:14:04.757 回答