|
19 | 19 |
|
20 | 20 | def upgrade() -> None: |
21 | 21 | """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 | + """) |
29 | 59 |
|
30 | 60 | # Resize columns to String(191) |
31 | 61 | op.alter_column( |
|
0 commit comments