multitenant: make CREATE SCHEMA call from hobo (#84514)
gitea/hobo/pipeline/head This commit looks good Details

This commit is contained in:
Frédéric Péters 2023-12-09 16:37:41 +01:00
parent 8917ae5581
commit 1a49608b6a
4 changed files with 16 additions and 12 deletions

View File

@ -17,4 +17,4 @@ class Command(BaseCommand):
print()
print(self.style.NOTICE('=== Creating schema ') + self.style.SQL_TABLE(tenant.schema_name))
tenant.create_schema(check_if_exists=True)
tenant.create_schema()

View File

@ -73,7 +73,7 @@ class Command(BaseCommand):
print()
print(msg)
with transaction.atomic():
tenant.create_schema(check_if_exists=True, legacy_schema_name=legacy_schema)
tenant.create_schema(legacy_schema_name=legacy_schema)
except Exception as e:
if legacy_hostname:
os.rename(tenant_dir_tmp, legacy_tenant_dir)

View File

@ -4,6 +4,7 @@ import urllib.parse
from shutil import rmtree
from django.conf import settings
from django.core.management import call_command
from django.db import connection
from django.utils import timezone
from tenant_schemas.models import TenantMixin
@ -53,18 +54,21 @@ class Tenant(TenantMixin):
return urllib.parse.urljoin(self.get_base_url(), location)
def create_schema(self, check_if_exists=False, sync_schema=True, verbosity=1, legacy_schema_name=None):
if not legacy_schema_name:
return super().create_schema(check_if_exists, sync_schema, verbosity)
# safety check
# safety checks
_check_schema_name(self.schema_name)
_check_schema_name(legacy_schema_name)
if check_if_exists and schema_exists(self.schema_name):
_check_schema_name(legacy_schema_name or 'ok')
if legacy_schema_name and not schema_exists(legacy_schema_name):
return False
if not schema_exists(legacy_schema_name):
return False
# rename schema
cursor = connection.cursor()
cursor.execute('ALTER SCHEMA %s RENAME TO %s' % (legacy_schema_name, self.schema_name))
if legacy_schema_name:
# rename schema
cursor.execute('ALTER SCHEMA %s RENAME TO %s' % (legacy_schema_name, self.schema_name))
else:
cursor.execute('CREATE SCHEMA IF NOT EXISTS %s' % self.schema_name)
if sync_schema:
call_command(
'migrate_schemas', schema_name=self.schema_name, interactive=False, verbosity=verbosity
)
connection.set_schema_to_public()
def delete(self, force_drop=False, *args, **kwargs):

View File

@ -84,7 +84,7 @@ def tenant_factory(transactional_db, tenant_base, settings):
schema_name = name.replace('-', '_').replace('.', '_')
t = Tenant(domain_url=name, schema_name=schema_name)
with transaction.atomic():
t.create_schema(check_if_exists=True)
t.create_schema()
connection.set_schema_to_public()
tenants.append(t)
return t