Skip to content

fix(python): emit Alembic op.execute SQL as an escaped string literal - #151

Open
devinpadron1 wants to merge 1 commit into
apsoai:mainfrom
devinpadron1:fix/148-python-migration-quoting
Open

devinpadron1 wants to merge 1 commit into
apsoai:mainfrom
devinpadron1:fix/148-python-migration-quoting

Conversation

@devinpadron1

Copy link
Copy Markdown

generateMigration wrapped each statement in """…""". SQL ending in a quoted identifier left a stray quote, so Python failed with SyntaxError: unterminated string literal.

Statements are now JSON.stringify(sql), which escapes the quotes inside the SQL as \", so they can't end the string early:

-    op.execute("""DROP TABLE "user"""")
+    op.execute("DROP TABLE \"user\"")

Go is unaffected: goose migrations are plain .sql.

New test runs the generated migration in python3; 390 tests pass, lint 0 errors.

Fixes #148

PythonGenerator.generateMigration wrapped each statement in """...""".
SQL from TypeORM usually ends in a quoted identifier, so the line ended
in four quotes (DROP TABLE "user"""") and most generated migrations
failed with "SyntaxError: unterminated string literal".

Emit JSON.stringify(sql) instead. Each JSON escape (\" \\ \n \t \uXXXX)
means the same in a Python string literal, so the SQL reaches
op.execute unchanged.

The new test runs the generated migration in python3 under a stub
alembic.op and checks it records exactly the input SQL (quoted
identifier, backslash, newlines, and the downgrade path). It is skipped
when python3 is not installed.

fixes apsoai#148
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

apso migrate: generated Python (Alembic) migrations do not compile

1 participant