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```