首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何只在内存中运行Django的测试数据库?

如何只在内存中运行Django的测试数据库?
EN

Stack Overflow用户
提问于 2010-06-23 02:45:21
回答 5查看 51K关注 0票数 130

我的Django单元测试需要很长时间才能运行,所以我正在寻找加速的方法。我正在考虑安装一个SSD,但我知道这也有它的缺点。当然,我可以用我的代码做一些事情,但我正在寻找一个结构修复。即使运行一次测试也很慢,因为每次都需要重新构建/南迁移数据库。我的想法是..。

既然我知道测试数据库总是很小,为什么我不能简单地将系统配置为始终将整个测试数据库保存在RAM中?永远不要碰磁盘。如何在Django中配置?我更喜欢继续使用MySQL,因为这是我在生产中使用的,但如果SQLite3或其他东西让这件事变得容易,我会走那条路。

SQLite或MySQL是否有完全在内存中运行的选项?应该可以配置一个RAM盘,然后配置测试数据库来存储它的数据,但是我不确定如何告诉Django / MySQL为某个数据库使用不同的数据目录,特别是因为它每次运行都会被擦除和重新创建。(我用的是Mac FWIW。)

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-06-23 08:39:27

如果在运行测试时将数据库引擎设置为sqlite3,则返回Django will use a in-memory database

运行测试时,我在settings.py中使用如下代码将引擎设置为sqlite:

代码语言:javascript
复制
if 'test' in sys.argv:
    DATABASE_ENGINE = 'sqlite3'

或者在Django 1.2中:

代码语言:javascript
复制
if 'test' in sys.argv:
    DATABASES['default'] = {'ENGINE': 'sqlite3'}

最后在Django 1.3和1.4中:

代码语言:javascript
复制
if 'test' in sys.argv:
    DATABASES['default'] = {'ENGINE': 'django.db.backends.sqlite3'}

(对于Django 1.3,到后端的完整路径并不是必须的,但可以使设置向前兼容。)

您还可以添加以下行,以防您在南迁移时遇到问题:

代码语言:javascript
复制
    SOUTH_TESTS_MIGRATE = False
票数 170
EN

Stack Overflow用户

发布于 2010-06-23 03:22:18

MySQL支持名为"MEMORY“的存储引擎,您可以在数据库配置(settings.py)中对其进行如下配置:

代码语言:javascript
复制
    'USER': 'root',                      # Not used with sqlite3.
    'PASSWORD': '',                  # Not used with sqlite3.
    'OPTIONS': {
        "init_command": "SET storage_engine=MEMORY",
    }

请注意,内存存储引擎不支持blob / text列,因此如果您使用的是django.db.models.TextField,这将不适用于您。

票数 22
EN

Stack Overflow用户

发布于 2010-06-23 03:22:58

我不能回答你的主要问题,但你可以做一些事情来加快速度。

首先,确保您的MySQL数据库设置为使用InnoDB。然后,它可以在每次测试之前使用事务回滚数据库的状态,这在我的经验中导致了巨大的加速。您可以在settings.py中传递数据库初始化命令(Django1.2语法):

代码语言:javascript
复制
DATABASES = {
    'default': {
            'ENGINE':'django.db.backends.mysql',
            'HOST':'localhost',
            'NAME':'mydb',
            'USER':'whoever',
            'PASSWORD':'whatever',
            'OPTIONS':{"init_command": "SET storage_engine=INNODB" } 
        }
    }

其次,您不需要每次都运行South迁移。在您的settings.py中设置SOUTH_TESTS_MIGRATE = False,将使用普通同步数据库创建数据库,这将比运行所有历史迁移快得多。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3096148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档