Запуск тестов Django заканчивается исключением MigrationSchemaMissing

Я пишу, потому что у меня есть большая проблема. У меня есть проект на Django, в котором я использую django-tenants. К сожалению, я не могу провести ни одного теста, так как они заканчиваются следующей ошибкой при вызове миграций: 'django.db.migrations.exceptions.MigrationSchemaMissing: Unable to create the django_migrations table (не выбрана схема для создания в LINE 1: CREATE TABLE „django_migrations“ („id“ bigint NOT NULL PRIMA...'

)

Проблема стоит довольно остро. Я сыт по горло ошибками регрессии и хотел бы написать тесты для кода. Буду признателен за любое предложение. Если у вас есть предложения по улучшению проекта, я тоже с удовольствием об этом прочитаю.

Подробности проекта ниже. С наилучшими пожеланиями

Зависимости

    [tool.poetry.dependencies]
    python = "^3.13"
    django = "5.1.8"  # The newest version is not compatible with django-tenants yet
    django-tenants = "^3.7.0"
    dj-database-url = "^2.3.0"
    django-bootstrap5 = "^25.1"
    django-bootstrap-icons = "^0.9.0"
    uvicorn = "^0.34.0"
    uvicorn-worker = "^0.3.0"
    gunicorn = "^23.0.0"
    whitenoise = "^6.8.2"
    encrypt-decrypt-fields = "^1.3.6"
    django-bootstrap-modal-forms = "^3.0.5"
    django-model-utils = "^5.0.0"
    werkzeug = "^3.1.3"
    tzdata = "^2025.2"
    pytz = "^2025.2"
    psycopg = {extras = ["binary", "pool"], version = "^3.2.4"}
    django-colorfield = "^0.13.0"
    sentry-sdk = {extras = ["django"], version = "^2.25.1"}

Settings.py

Структура проекта: Structure

Простая тестовая установка:

# External Dependencies
from django.utils.timezone import now
from django_tenants.test.cases import TenantTestCase
from django_tenants.utils import schema_context

# Current App
from sfe.tenant.models.due_date import DueDate


class DueDateModelTests(TenantTestCase):
    def setUp(self):
        super().setUp()

    def test_create_due_date(self):
        with schema_context(self.tenant.schema_name):
            DueDate.objects.create(date=now().date(), name="TestDueDate")

        assert DueDate.objects.all().count() == 1

use
TEST_RUNNER = "django_tenants.test.runner.TenantTestRunner"
instead of
TEST_RUNNER = "django.test.runner.DiscoverRunner"

Also, i see your test set up, your syyntax is sort of off

modify your

def test_create_due_date(self):
to

def test_create_due_date(self):
    with schema_context(self.tenant.schema_name):
        DueDate.objects.create(date=now().date(), name="TestDueDate")
        self.assertEqual(DueDate.objects.all().count(), 1)

Problem solved. I had to change one of my migration from:

    # External Dependencies
    from django.conf import settings
    from django.db import migrations
    
    default_tenant_data = {
        "domain_url": settings.DEFAULT_DOMAIN,
        "schema_name": "public",
        "name": "default",
        "paid_until": "2100-12-31",
        "on_trial": True,
    }
    demo_tenant_data = {
        "domain_url": f"demo.{settings.DEFAULT_DOMAIN}",
        "schema_name": "demo",
        "name": "Demo Sp. z o. o.",
        "paid_until": "2100-12-31",
        "on_trial": True,
    }
    
    
    def add_entry(apps, schema_editor):
        del schema_editor
        SystemTenant = apps.get_model("common", "SystemTenant")
        SystemTenant(**default_tenant_data).save()
        SystemTenant(**demo_tenant_data).save()
    
    
    def remove_entry(apps, schema_editor):
        del schema_editor
        SystemTenant = apps.get_model("common", "SystemTenant")
        SystemTenant.objects.filter(**default_tenant_data).delete()
        SystemTenant.objects.filter(**demo_tenant_data).delete()
    
    
    class Migration(migrations.Migration):
        dependencies = [("common", "0001_initial")]
        operations = [
            migrations.RunPython(add_entry, remove_entry),
        ]

to

    # External Dependencies
    from django.conf import settings
    from django.db import migrations
    
    default_tenant_data = {
        "domain_url": settings.DEFAULT_DOMAIN,
        "schema_name": "public",
        "name": "default",
        "paid_until": "2100-12-31",
        "on_trial": True,
    }
    demo_tenant_data = {
        "domain_url": f"demo.{settings.DEFAULT_DOMAIN}",
        "schema_name": "demo",
        "name": "Demo Sp. z o. o.",
        "paid_until": "2100-12-31",
        "on_trial": True,
    }
    
    
    def add_entry(apps, schema_editor):
        del schema_editor
        SystemTenant = apps.get_model("common", "SystemTenant")
        SystemTenant(**default_tenant_data).save()
        SystemTenant(**demo_tenant_data).save()
    
    
    def remove_entry(apps, schema_editor):
        del schema_editor
        SystemTenant = apps.get_model("common", "SystemTenant")
        SystemTenant.objects.filter(**default_tenant_data).delete()
        SystemTenant.objects.filter(**demo_tenant_data).delete()
    
    
    def create_demo_schema(apps, schema_editor):
        schema_editor.execute("CREATE SCHEMA IF NOT EXISTS demo;")
    
    
    def delete_demo_schema(apps, schema_editor):
        schema_editor.execute("DROP SCHEMA IF EXISTS demo CASCADE;")
    
    
    class Migration(migrations.Migration):
        dependencies = [("common", "0001_initial")]
        operations = [
            migrations.RunPython(add_entry, remove_entry),
            migrations.RunPython(create_demo_schema, delete_demo_schema),
        ]

Package django-tenant-schemas can create missing schema, django-tenants cannot. Pretty weird behaviour but I understand it is like it is.

Вернуться на верх