我有一个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')
答案 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文档。