测试只读表(Django)时不存在表

时间:2016-06-29 09:32:14

标签: python mysql django django-migrations

我有一个Django项目。这个项目中有2个数据库,我写了一个Router来制作其中一个readonly。我编写了一些使用此readonly数据库的单元测试,但是当我运行python manage.py test时,它说

  

ProgrammingError:(1146,“表'test_arzesh-db.company'没有   存在“)

以下是数据库的设置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'broker-website',
        'USER': 'root',
        'PASSWORD': '',
        'HOST': 'localhost',
        'OPTIONS': {
            "init_command": "SET foreign_key_checks = 0;",
        },
    },
    'arzesh-db': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'arzesh-db',
        'USER': 'root',
        'PASSWORD': '',
        'TEST_DATABASE': 'default',
    },
    'TEST': {
        'CHARSET': 'utf8',
        'COALATION': 'utf8-unicode-ci',
    }
}

以下是我路由器的代码:

class Router(object):
    """
    A router to control all database operations on models in the
    auth application.
    """
    def db_for_read(self, model, **hints):
        """
        Attempts to read auth models go to auth_db.
        """
        if model._meta.app_label == 'arzesh':
            return 'arzesh-db'
        return 'default'

    def db_for_write(self, model, **hints):
        """
        Attempts to write auth models go to auth_db.
        """
        if model._meta.app_label == 'arzesh':
            return 'arzesh-db'
        return 'default'

    def allow_relation(self, obj1, obj2, **hints):
        """
        Allow relations if a model in the auth app is involved.
        """
        return True

    def allow_migrate(self, db, app_label, model=None, **hints):
        """
        Make sure the auth app only appears in the 'auth_db'
        database.
        """
        if app_label == 'arzesh':
            return False
        return True

以下是只读数据库中的模型:

class Company(models.Model):
    def __unicode__(self):
        return self.tick

    id = models.AutoField(primary_key=True)
    tick = models.CharField(unique=True, max_length=32)
    name = models.CharField(max_length=128, unique=True)

    class Meta:
        managed = False
        db_table = 'company'

以下是unittest中出错的行:

company.objects.create(id=1, tick='a', name='a')

1 个答案:

答案 0 :(得分:2)

首先,这是不准确的,

  

我写了一些使用这个只读数据库的单元测试

那是因为

  

需要数据库的测试(即模型测试)将不会使用您的   “真实”(生产)数据库。创建单独的空白数据库   用于测试。   ...   默认测试数据库名称是通过将test_预先添加到   DATABASES中每个NAME的值

参考:https://docs.djangoproject.com/en/1.9/topics/testing/overview/#the-test-database

错误是

这一事实证实了这一点
  

ProgrammingError:(1146,“表' test_arzesh -db.company'不存在”)

是的,那么测试数据库是如何创建的呢?根据您的迁移内容。但你有

    class Meta:
        managed = False
        db_table = 'company'

此处的managed = False表示不会创建任何迁移,因此该表将不存在于您的测试数据库中。因此错误。

<强>解。 使用创建此表的RunSQL手动添加迁移。使用SHOW CREATE TABLE company中的SQL。首先要做到这一点

./manage.py makemigrations myapp --empty

编辑新创建的迁移文件,将RunPython或RunSQL代码添加到其中。传递给RunSQL的SQL是您在mysql控制台中由SHOW CREATE TBABLE company生成的SQL。有关其他信息和示例,请参阅RunSQL文档。