Django Heroku django-tenant attributeerror: объект 'databasewrapper' не имеет атрибута 'schema_name'

Я переношу свою разработку на django-tenants, у меня не возникло никаких проблем с этим на моем локальном компьютере, но когда я переношу свои изменения в среду prod в Heroku, я получаю следующую ошибку:

ошибка атрибута: объект 'databasewrapper' не имеет атрибута 'schema_name'

Файл проверки

web: gunicorn tlgrmbot.wsgi

Настройки базы данных:

DATABASES = {
'default': {
    'ENGINE': 'django_tenants.postgresql_backend',
    'NAME': os.environ.get('DB_NAME_BOT'),
    'USER': os.environ.get('DB_USER_BOT'),
    'PASSWORD': os.environ.get('DB_PWD_BOT'),
    'HOST': 'localhost',
    'PORT': '5432',
}
}

    DATABASE_ROUTERS = (
        'django_tenants.routers.TenantSyncRouter',
    )
    
    TENANT_MODEL = "tenant_manager.Tenant"
    
    TENANT_DOMAIN_MODEL = "tenant_manager.Domain"

и у меня есть этот переключатель для среды prod:

if mode == 'webhook':
    DATABASES['default'] = dj_database_url.config(
    conn_max_age=600, ssl_require=True)

Проблема возникает, когда я пытаюсь выполнить миграцию в среде prod в Heroku

Журнал ошибок:

<module 'os' (frozen)>
Traceback (most recent call last):
  File "/app/manage.py", line 22, in <module>
    main()
  File "/app/manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "/app/.heroku/python/lib/python3.11/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_line
    utility.execute()
  File "/app/.heroku/python/lib/python3.11/site-packages/django/core/management/__init__.py", line 413, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/app/.heroku/python/lib/python3.11/site-packages/django/core/management/base.py", line 354, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/app/.heroku/python/lib/python3.11/site-packages/django/core/management/base.py", line 398, in execute
    output = self.handle(*args, **options)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/app/.heroku/python/lib/python3.11/site-packages/django_tenants/management/commands/migrate_schemas.py", line 66, in handle
    executor.run_migrations(tenants=[self.PUBLIC_SCHEMA_NAME])
  File "/app/.heroku/python/lib/python3.11/site-packages/django_tenants/migration_executors/standard.py", line 11, in run_migrations
    run_migrations(self.args, self.options, self.codename, self.PUBLIC_SCHEMA_NAME)
  File "/app/.heroku/python/lib/python3.11/site-packages/django_tenants/migration_executors/base.py", line 45, in run_migrations
    connection.set_schema(schema_name, tenant_type=tenant_type, include_public=False)
    ^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'DatabaseWrapper' object has no attribute 'set_schema'

Как я думаю, когда вы используете dj_database_url.config() в рабочей среде, это означает переопределение вашего движка базы данных django-арендаторов стандартным движком PostgreSQL. Это происходит потому, что dj_database_url.config() не знает о пользовательском движке django_tenants.postgresql_backend.

Итак, чтобы решить эту проблему, вам нужно изменить конфигурацию рабочей базы данных, чтобы сохранить движок django-tenants.

if mode == 'webhook':
    db_config = dj_database_url.config(
        conn_max_age=600, 
        ssl_require=True
    )
    
    # Override the engine to use django-tenants backend
    db_config['ENGINE'] = 'django_tenants.postgresql_backend'
    
    # Update the DATABASES configuration
    DATABASES['default'] = db_config```
Вернуться на верх