所以我有一个项目,我目前正在工作的地方,我的数据库用户没有能力在服务器上创建和销毁数据库,我的生产数据库存储。所以我决定尝试在sqlite3数据库中找到我的测试数据库,就像Django附带的一样。我试着这样做,我想我在Django文档的某个地方读到,但它不工作,并不断给我错误:
AttributeError: 'PosixPath'对象没有属性'startswith'
代码:
DATABASES = {
# C:Program FilesMicrosoft SQL ServerMSSQL15.SQLEXPRESSMSSQLDATA
'default': {
'ENGINE': 'engine',
'NAME': 'db',
'HOST': '1.1.1.1',
'PORT': '1',
'USER': 'username',
'PASSWORD': 'password',
'OPTIONS': {
'driver': 'driver',
'connection_timeout': 15
},
'TEST': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'testdb.sqlite3',
'HOST': 'localhost'
}
},
}
我觉得我很接近,所以我试着删除BASE_DIR,只是用文件名,但仍然给我发送消息,说用户没有能力在master中创建DB,这意味着它仍然连接到相同的生产服务器。
最好的选择是在测试和生产中始终使用相同的数据库以保持连续性。
你可以考虑手动创建数据库,并使用——keepdb选项来避免每次测试运行时创建/销毁数据库。
python manage.py test --keepdb
除了这个配置,您还应该创建一个数据库路由,将请求路由到正确的DB。
编辑:如果您希望在不同的主机上有多个db,则不需要base_dir。另外,db名称应该与默认名称处于同一级别:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydb',
'USER': 'user',
'PASSWORD': 'password',
'HOST': 'server1',
'PORT': '1111'
},
'test': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'mydb',
'USER': 'user',
'PASSWORD': 'password',
'HOST': 'server2',
'PORT': '1111'
}
}
然后在你的测试中,你可以这样写:
class MyTestCases(TestCase):
databases = {'test'}
def test_other_db_query(self):
pass
关于如何使用另一个数据库进行测试的更多信息:https://docs.djangoproject.com/en/3.2/topics/testing/tools/testing-multi-db