【问题标题】:django-admin.py sqlflush error during tests测试期间的 django-admin.py sqlflush 错误
【发布时间】:2011-05-29 14:38:22
【问题描述】:

我在我的 Django 应用程序中有一组曾经通过的测试,但在软件发展的某个阶段,我在运行测试时开始收到这种消息:

错误:无法刷新数据库 test_totomanager_demo。可能的原因:
* 数据库未运行或配置不正确。
* 至少有一个预期的数据库表不存在。
* SQL 无效。
提示:查看“django-admin.py sqlflush”的输出。这是该命令无法运行的 SQL。
完整错误:(1105,“MyISAM 表 'video_videoinstallation' 正在使用中(很可能由 MERGE 表使用)。尝试 FLUSH TABLES。”)

数据库是 MySQL。

开始发生此错误的确切测试是不可预测的。这不是第一次发生,但经过一两次尝试它曾经通过,这次我无法让测试到达终点。

关于如何避免这种情况的任何提示?

【问题讨论】:

  • 什么数据库?数据库是托管在同一个盒子还是其他地方?你检查过数据库日志吗?你检查过系统日志吗?
  • 数据库是 MySQL,只在标签中,对不起。我检查了 /var/log/messages 并没有什么不同。现在我试图在记录所有 mysql 查询时再次重现(突然停止发生)。
  • 我没有解决这个问题,但我已经避免了。我认为这与分叉进程然后退出子进程的测试有关。我最近对此表示赞同,我想知道其他有这个问题的人是否对分叉做过任何事情。
  • 当您使用 innoDB 而不是 MyISAM 时会发生什么变化吗?

标签: mysql django myisam


【解决方案1】:

这可能是因为你的表类型是MyISAM,它锁定了整个表,如果你不需要在这个表中“FULL TEXT SEARCH”那么你应该把它变成一个innodb表。

我不知道 django 测试是如何运行的,但一种可能的解决方案是一次运行一个测试,而不是一次运行所有测试,以避免在表被锁定时进行测试。

【讨论】:

    【解决方案2】:

    我自己也遇到了这个问题,并意识到这是因为我还没有为模型更改创建迁移。

    试试:

    ./manage.py schemamigration <your_app_name> --auto
    

    我在这个 virtualenv 中安装了南迁移,所以如果你不想自己编写迁移,这可能是一个要求。

    【讨论】:

      【解决方案3】:

      使用 python 的 TestCase 类而不是 Django 的。

      Replace
      
      from django.test import TestCase
      class TestChrono(TestCase):
      
      with
      
      import unittest
      class TestChrono(unittest.TestCase):
      

      这是一种变通解决方案,但如果您不使用固定装置,它肯定不会影响您的测试用例。 Django Testcase 尝试使用事务管理,因此您收到此错误。

      【讨论】:

        猜你喜欢
        • 2013-05-25
        • 2018-12-06
        • 1970-01-01
        • 1970-01-01
        • 2014-10-18
        • 2013-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多