Skip to content

Commit 02fe1f2

Browse files
committed
Fix migration issues for VARCHAR(191) column resize
- Update db.py SQLAlchemy model to match migration (String(191)) - Add dialect-specific SQL handling in migration (SQLite, PostgreSQL, MySQL) - Use CHAR_LENGTH for character-based truncation (not byte-based LENGTH in MySQL) - Ensure truncation works correctly across all supported database backends
1 parent 9bed537 commit 02fe1f2

File tree

2 files changed

+39
-9
lines changed

2 files changed

+39
-9
lines changed

mcpgateway/alembic/versions/878e287d2366_resize_url_and_slug_columns_to_191.py

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,43 @@
1919

2020
def upgrade() -> None:
2121
"""Upgrade schema."""
22-
# Truncate existing values longer than 191 chars
23-
op.execute("""
24-
UPDATE gateways
25-
SET slug = LEFT(slug, 191),
26-
url = LEFT(url, 191)
27-
WHERE LENGTH(slug) > 191 OR LENGTH(url) > 191;
28-
""")
22+
# Get database dialect for dialect-specific operations
23+
bind = op.get_bind()
24+
dialect_name = bind.dialect.name
25+
26+
# Truncate existing values longer than 191 chars using dialect-appropriate functions
27+
if dialect_name == 'sqlite':
28+
# SQLite uses SUBSTR and LENGTH
29+
op.execute("""
30+
UPDATE gateways
31+
SET slug = SUBSTR(slug, 1, 191),
32+
url = SUBSTR(url, 1, 191)
33+
WHERE LENGTH(slug) > 191 OR LENGTH(url) > 191;
34+
""")
35+
elif dialect_name == 'postgresql':
36+
# PostgreSQL supports LEFT and CHAR_LENGTH
37+
op.execute("""
38+
UPDATE gateways
39+
SET slug = LEFT(slug, 191),
40+
url = LEFT(url, 191)
41+
WHERE CHAR_LENGTH(slug) > 191 OR CHAR_LENGTH(url) > 191;
42+
""")
43+
elif dialect_name == 'mysql':
44+
# MySQL supports LEFT and CHAR_LENGTH (character-based, not byte-based)
45+
op.execute("""
46+
UPDATE gateways
47+
SET slug = LEFT(slug, 191),
48+
url = LEFT(url, 191)
49+
WHERE CHAR_LENGTH(slug) > 191 OR CHAR_LENGTH(url) > 191;
50+
""")
51+
else:
52+
# Fallback for other databases
53+
op.execute("""
54+
UPDATE gateways
55+
SET slug = SUBSTR(slug, 1, 191),
56+
url = SUBSTR(url, 1, 191)
57+
WHERE LENGTH(slug) > 191 OR LENGTH(url) > 191;
58+
""")
2959

3060
# Resize columns to String(191)
3161
op.alter_column(

mcpgateway/db.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2413,8 +2413,8 @@ class Gateway(Base):
24132413

24142414
id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: uuid.uuid4().hex)
24152415
name: Mapped[str] = mapped_column(String(255), nullable=False)
2416-
slug: Mapped[str] = mapped_column(String(255), nullable=False)
2417-
url: Mapped[str] = mapped_column(String(767), nullable=False)
2416+
slug: Mapped[str] = mapped_column(String(191), nullable=False)
2417+
url: Mapped[str] = mapped_column(String(191), nullable=False)
24182418
description: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
24192419
transport: Mapped[str] = mapped_column(String(20), default="SSE")
24202420
capabilities: Mapped[Dict[str, Any]] = mapped_column(JSON)

0 commit comments

Comments
 (0)