我有一个相当复杂的Django项目,这使得使用灯具加载数据变得困难/不可能。在运行Django测试之前加载SQL转储
我想要做的是在所有表由testrunner创建并且实际测试开始运行之前,从生产数据库服务器加载数据库转储。我试过MyTestCase.setUp()中的各种“魔术”,但没有运气。
任何建议将是最受欢迎的。谢谢。
我有一个相当复杂的Django项目,这使得使用灯具加载数据变得困难/不可能。在运行Django测试之前加载SQL转储
我想要做的是在所有表由testrunner创建并且实际测试开始运行之前,从生产数据库服务器加载数据库转储。我试过MyTestCase.setUp()中的各种“魔术”,但没有运气。
任何建议将是最受欢迎的。谢谢。
您可能需要查看定义自定义测试运行器。这里有一些信息:http://docs.djangoproject.com/en/dev/topics/testing/#using-different-testing-frameworks
基本上我认为你可以从django.test.simple.run_tests中复制默认的测试运行器,然后修改它以满足您的需求。
我以前没有这样做过,但从我的理解,这将是定制这种方式。
灯具是最好的选择。您是否尝试过使用./manage.py dumpdata从当前数据库创建一个灯具?我还没有看到复杂模型的失败,但我想这是可能的。
假设你使用的是mysql,你应该可以使用mysqldump来编写脚本。
Django支持加载SQL文件时做执行syncdb,复位,或开始测试运行 - 这不正是你的描述:
http://docs.djangoproject.com/en/dev/howto/initial-data/#providing-initial-sql-data
您需要在您的应用程序创建一个“SQL”目录目录,然后在该目录中放置一个名为“mymodel.sql”的文件(其中“MyModel”是相应的型号名称)。
myproject/
|--myapp/
|--sql/
|--mymodel.sql
您可以使用转储工具为您的数据库创建此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
由于此答案已发布,因此此行为在Django中无法使用。运行测试框架时,Django 1.2现在忽略'sql /'目录中的'sql'文件。 – 2011-03-06 01:40:09
如果我没有记错的装载SQL会更快,因为它不具有固定装置做的开销。 我正在寻求解决这个相同的问题。我有一个大数据库加载测试,我想保持加载快速。 – Jeff 2009-12-30 20:58:45
我广泛使用泛型关系,这在使用灯具时是个问题。看起来这已经在1.2版本的工作中得到解决,请参阅http://docs.djangoproject.com/en/dev/topics/serialization/#natural-keys – knutin 2009-12-31 18:51:31
这是一个耻辱,你只能投票评论,而不是下降。这第一条评论只是回应。 – boatcoder 2012-10-25 21:38:34