Django Rest Framework 中的 “django.db.utils.ProgrammingError: relation “patient“ does not exist“ 错误的解决
在使用Django Rest Framework测试时出现"relation 'patient' does not exist"错误时,可通过以下步骤解决:首先运行migrate命令创建数据库表;若无效则删除.pyc文件并分应用迁移,或重新生成迁移文件。进阶方法包括使用@override_settings装饰器覆盖数据库设置、改用TransactionTestCase类,以及检
·
在使用 Django Rest Framework 时,在运行测试时遇到错误 “django.db.utils.ProgrammingError: relation “patient” does not exist”。
-
解决方案
为了解决此错误,可以采取以下步骤:-
首先,确保在测试数据库中创建了名为 “patient” 的表。可以通过运行以下命令来创建表:
python manage.py migrate -
如果已经创建了 “patient” 表,但仍然遇到此错误,则可以尝试以下方法:
-
删除所有带
.pyc扩展名的文件。 -
逐个运行以下命令:
django-admin.py migrate auth django-admin.py migrate contenttypes django-admin.py migrate sites django-admin.py migrate YOUR_USER_APP django-admin.py migrate -
如果以上方法仍然无效,则可以使用
makemigrations命令逐个为所有应用生成迁移文件,然后运行migrate命令应用这些迁移。 -
确保从代码中删除了
managed = False。
-
-
如果以上方法都无法解决问题,则可以尝试以下方法:
- 在测试用例中使用
@override_settings装饰器来覆盖数据库设置。 - 在测试用例中使用
TransactionTestCase类而不是APITestCase类。
- 在测试用例中使用
-
如果仍然遇到错误,则可以尝试以下方法:
- 检查数据库是否已启动并正在运行。
- 检查数据库用户是否具有对数据库的访问权限。
- 检查数据库连接字符串是否正确。
-
如果以上方法都无法解决问题,则可以向 Django 社区寻求帮助。
-
代码例子:
# 在测试用例中使用 @override_settings 装饰器来覆盖数据库设置
@override_settings(DATABASES={'default': {'ENGINE': 'django.db.backends.sqlite3', 'NAME': ':memory:'}})
class PatientTests(APITestCase):
def test_create_patient(self):
url = reverse('patient-list')
data = {'firstname': 'ivan', 'lastname': 'ivanov'}
response = self.client.post(url, data)
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertEqual(Patient.objects.count(), 1)
self.assertEqual(Patient.objects.get().firstname, 'ivan')
def test_get_patient(self):
url = reverse('patient-detail', args=[1])
response = self.client.get(url)
self.assertEqual(response.data, {'firstname': 'ivan'})
# 在测试用例中使用 TransactionTestCase 类而不是 APITestCase 类
class PatientTests(TransactionTestCase):
def test_create_patient(self):
url = reverse('patient-list')
data = {'firstname': 'ivan', 'lastname': 'ivanov'}
response = self.client.post(url, data)
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertEqual(Patient.objects.count(), 1)
self.assertEqual(Patient.objects.get().firstname, 'ivan')
def test_get_patient(self):
url = reverse('patient-detail', args=[1])
response = self.client.get(url)
self.assertEqual(response.data, {'firstname': 'ivan'})
更多推荐
所有评论(0)