Skip to content

Commit 784e7a1

Browse files
committed
Take separator into account when computing maximum schema name prefix length
1 parent 4daceb6 commit 784e7a1

File tree

2 files changed

+16
-12
lines changed

2 files changed

+16
-12
lines changed

psqlextra/schema.py

+12-8
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,9 @@ def create_time_based(
7171
"""
7272

7373
suffix = timezone.now().strftime("%Y%m%d%H%m%S")
74-
cls._verify_generated_name_length(prefix, suffix)
74+
name = cls._create_generated_name(prefix, suffix)
7575

76-
return cls.create(f"{prefix}_{suffix}", using=using)
76+
return cls.create(name, using=using)
7777

7878
@classmethod
7979
def create_random(
@@ -91,9 +91,9 @@ def create_random(
9191
"""
9292

9393
suffix = os.urandom(4).hex()
94-
cls._verify_generated_name_length(prefix, suffix)
94+
name = cls._create_generated_name(prefix, suffix)
9595

96-
return cls.create(f"{prefix}_{suffix}", using=using)
96+
return cls.create(name, using=using)
9797

9898
@classmethod
9999
def delete_and_create(
@@ -160,14 +160,18 @@ def delete(
160160
schema_editor.delete_schema(self.name, cascade=cascade)
161161

162162
@classmethod
163-
def _verify_generated_name_length(cls, prefix: str, suffix: str) -> None:
164-
max_prefix_length = cls.NAME_MAX_LENGTH - len(suffix)
163+
def _create_generated_name(cls, prefix: str, suffix: str) -> str:
164+
separator = "_"
165+
generated_name = f"{prefix}{separator}{suffix}"
166+
max_prefix_length = cls.NAME_MAX_LENGTH - len(suffix) - len(separator)
165167

166-
if len(prefix) > max_prefix_length:
168+
if len(generated_name) > cls.NAME_MAX_LENGTH:
167169
raise ValidationError(
168-
f"Schema prefix '{prefix}' is longer than {max_prefix_length} characters. Together with the generated suffix of {len(suffix)} characters, the name would exceed Postgres's limit of {cls.NAME_MAX_LENGTH} characters."
170+
f"Schema prefix '{prefix}' is longer than {max_prefix_length} characters. Together with the separator and generated suffix of {len(suffix)} characters, the name would exceed Postgres's limit of {cls.NAME_MAX_LENGTH} characters."
169171
)
170172

173+
return generated_name
174+
171175

172176
PostgresSchema.default = PostgresSchema("public")
173177

tests/test_schema.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,9 @@ def test_postgres_schema_create_time_based():
5757
def test_postgres_schema_create_time_based_long_prefix():
5858
with pytest.raises(ValidationError) as exc_info:
5959
with freezegun.freeze_time("2023-04-07 13:37:23.4"):
60-
PostgresSchema.create_time_based("a" * 100)
60+
PostgresSchema.create_time_based("a" * 49)
6161

62-
assert "is longer than 49 characters" in str(exc_info.value)
62+
assert "is longer than 48 characters" in str(exc_info.value)
6363

6464

6565
def test_postgres_schema_create_random():
@@ -74,9 +74,9 @@ def test_postgres_schema_create_random():
7474

7575
def test_postgres_schema_create_random_long_prefix():
7676
with pytest.raises(ValidationError) as exc_info:
77-
PostgresSchema.create_random("a" * 100)
77+
PostgresSchema.create_random("a" * 55)
7878

79-
assert "is longer than 55 characters" in str(exc_info.value)
79+
assert "is longer than 54 characters" in str(exc_info.value)
8080

8181

8282
def test_postgres_schema_delete_and_create():

0 commit comments

Comments
 (0)