代码之家  ›  专栏  ›  技术社区  ›  Leopd

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

  •  116
  • Leopd  · 技术社区  · 16 年前

    SSD 但我知道这也有缺点。当然,我可以用我的代码做一些事情,但我正在寻找一个结构性修复。即使运行一个测试也很慢,因为每次都需要重建/迁移数据库。所以这是我的想法。。。

    既然我知道测试数据库总是很小的,为什么我不能配置系统,让整个测试数据库都保存在RAM中呢?绝对不要碰磁盘。如何在Django中配置?我宁愿继续使用 MySQL SQLite 3或者别的什么让这很容易,我会走那条路。

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

    7 回复  |  直到 10 年前
        1
  •  169
  •   Endre Both    7 年前

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

    settings.py 要在运行测试时将引擎设置为sqlite:

    if 'test' in sys.argv:
        DATABASE_ENGINE = 'sqlite3'
    

    或在Django 1.2中:

    if 'test' in sys.argv:
        DATABASES['default'] = {'ENGINE': 'sqlite3'}
    

    if 'test' in sys.argv:
        DATABASES['default'] = {'ENGINE': 'django.db.backends.sqlite3'}
    

    (对于django1.3来说,后端的完整路径并不是绝对必要的,但是可以使设置向前兼容。)

    如果您遇到南迁问题,还可以添加以下行:

        SOUTH_TESTS_MIGRATE = False
    
        2
  •  83
  •   Anurag Uniyal    14 年前

    python manage.py test --settings=mysite.test_settings myapp
    

    1. 你不必检查 test 或者sys.argv里的任何一个神奇的词, test_settings.py 可能只是

      from settings import *
      
      # make tests faster
      SOUTH_TESTS_MIGRATE = False
      DATABASES['default'] = {'ENGINE': 'django.db.backends.sqlite3'}
      

      或者您可以根据需要进一步调整它,将测试设置和生产设置清晰地分离开来。

    2. 另一个好处是,您可以使用生产数据库引擎而不是sqlite3来运行测试,从而避免了细微的错误,因此在开发过程中

      python manage.py test--settings=mysite.test\u settings myapp
      

      python manage.py test myapp
      

        3
  •  22
  •   muudscope    16 年前

    MySQL支持一个名为“内存”的存储引擎,您可以在数据库配置中配置它( settings.py

        'USER': 'root',                      # Not used with sqlite3.
        'PASSWORD': '',                  # Not used with sqlite3.
        'OPTIONS': {
            "init_command": "SET storage_engine=MEMORY",
        }
    

    请注意,内存存储引擎不支持blob/text列,因此如果您使用 django.db.models.TextField 这对你没用。

        4
  •  15
  •   Daniel Roseman    16 年前

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

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

    其次,您不需要每次都运行南迁。套 SOUTH_TESTS_MIGRATE = False 在settings.py中,数据库将使用纯syncdb创建,这比运行所有历史迁移要快得多。

        5
  •  10
  •   Potr Czachur    15 年前

    可以进行双重调整:

    • 使用事务表:初始fixtures状态将在每个TestCase之后使用数据库回滚来设置。
    • 将数据库数据目录放在ramdisk上:就数据库创建而言,您将获得更多收益,而且运行测试也将更快。

    我两个都用了,我很高兴。

    如何在Ubuntu上为MySQL设置:

    $ sudo service mysql stop
    $ sudo cp -pRL /var/lib/mysql /dev/shm/mysql
    
    $ vim /etc/mysql/my.cnf
    # datadir = /dev/shm/mysql
    $ sudo service mysql start
    

        6
  •  4
  •   neves    12 年前

    另一种方法:让另一个MySQL实例在使用RAM磁盘的tempfs中运行。此博客文章中的说明: Speeding up MySQL for testing in Django

    优势:

    • 您使用的数据库与生产服务器使用的数据库完全相同
    • 无需更改默认的mysql配置
        7
  •  2
  •   Alvin    8 年前

    根据Anurag的回答,我简化了这个过程,创建了相同的test\u设置,并在manage.py中添加了以下内容

    if len(sys.argv) > 1 and sys.argv[1] == "test":
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.test_settings")
    else:
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
    

        8
  •  -1
  •   Ehsan    6 年前

    使用下面的 setting.py

    DATABASES['default']['ENGINE'] = 'django.db.backends.sqlite3'