2009-12-30 20 views
8

我有一个相当复杂的Django项目,这使得使用灯具加载数据变得困难/不可能。在运行Django测试之前加载SQL转储

我想要做的是在所有表由testrunner创建并且实际测试开始运行之前,从生产数据库服务器加载数据库转储。我试过MyTestCase.setUp()中的各种“魔术”,但没有运气。

任何建议将是最受欢迎的。谢谢。

+2

如果我没有记错的装载SQL会更快,因为它不具有固定装置做的开销。 我正在寻求解决这个相同的问题。我有一个大数据库加载测试,我想保持加载快速。 – Jeff 2009-12-30 20:58:45

+0

我广泛使用泛型关系,这在使用灯具时是个问题。看起来这已经在1.2版本的工作中得到解决,请参阅http://docs.djangoproject.com/en/dev/topics/serialization/#natural-keys – knutin 2009-12-31 18:51:31

+4

这是一个耻辱,你只能投票评论,而不是下降。这第一条评论只是回应。 – boatcoder 2012-10-25 21:38:34

回答

-1

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

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

7

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。

  • SQLite [1]:echo'.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

+11

由于此答案已发布,因此此行为在Django中无法使用。运行测试框架时,Django 1.2现在忽略'sql /'目录中的'sql'文件。 – 2011-03-06 01:40:09

相关问题